在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)