Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MySQL中创建只在最右边(排序)列中不同的多列索引_Mysql_Sql_Sorting_Indexing - Fatal编程技术网

在MySQL中创建只在最右边(排序)列中不同的多列索引

在MySQL中创建只在最右边(排序)列中不同的多列索引,mysql,sql,sorting,indexing,Mysql,Sql,Sorting,Indexing,我在我的应用程序中遇到了一个场景,关于使用多列索引,我一直找不到一个好的答案 我有一个带列的订单表 (id, merchant_id, section_id, status_id, created_date, invoice_date, shipped_date, ...<other data columns> ) id的层次结构是,商户id包含多个区段id,每个区段id包含多个状态id,每个状态id包含一组订单。用户只能看到特定商户id、部门id、状态id组合中的订单。默认情况下

我在我的应用程序中遇到了一个场景,关于使用多列索引,我一直找不到一个好的答案

我有一个带列的订单表

(id, merchant_id, section_id, status_id, created_date, invoice_date, shipped_date, ...<other data columns> )
id的层次结构是,商户id包含多个区段id,每个区段id包含多个状态id,每个状态id包含一组订单。用户只能看到特定商户id、部门id、状态id组合中的订单。默认情况下,用户查看按发票日期排序的订单

这导致了明显的指数:

(merchant_id, section_id, status_id, invoice_date) 
这将给我一个过滤列的覆盖索引以及排序

但是-用户也可以在查看页面时更改排序顺序。因此,与其按照发票日期排序,不如按照发货日期或创建日期排序。它仍然会受到商户id、部门id和状态id上的过滤器的约束

这是否意味着我还需要在

(merchant_id, section_id, status_id, shipped_date)
以及

(merchant_id, section_id, status_id, created_date)
如果是这样的话,MySQL到底是利用了这些索引共享相同的3个最左边的列这一事实,还是我将在更新/插入时招致与3个不同索引一样多的惩罚

那么在磁盘使用方面呢?对于每个索引,最左边的3列是否会重复


对于这种情况,如果多个索引共享一些相同的最左边的列,是否有更好的解决方案或方法?

尝试重新创建索引(商户id、部门id和状态id)。这对于所有不同的查询都很有用,即使是在不同的orderby条件下。

是的,复合键用于左->右排序。如果您有一个索引
(a,b,c,d,e)
,并且您的查询涉及
其中a,b,d,e
,那么该索引可以用于
a,b
字段,但不能用于
d,e
,因为您没有包括
c
字段。我理解,然而,我的问题是,如果我有多个复合索引,它们只在最右边的列中不同,例如:(a,b,c,d)和(a,b,c,e),(a,b,c,f),mysql是否利用了这三个索引共享相同的左继承权,或者它是否复制了数据3x.ah。明白了。不,它完全是3个单独的索引,有3个单独的数据缓存,如果您更改任何索引字段,则有3个单独的更新。基本上,我对索引(a、b、c、d)、(a、b、c、f)和(a、b、c、g)的写操作是否会受到与(a、b、c、d)、(b、d、c、a)和(c、d、b、a)等不兼容索引相同的性能惩罚?假设没有
limit
子句,这些查询平均给出多少行?十万,一万,百万?如果只有几十行或几百行,那么只在前三列上创建一个索引,并让MySql进行文件排序。索引是磁盘空间、查询时间和更新时间之间的折衷。更多索引—可能缩短查询时间(但没有任何保证),但总是有更多的磁盘空间和更高的更新时间—反之亦然。
(merchant_id, section_id, status_id, created_date)