我在应用程序中遇到了一个场景,无法找到有关使用多列索引的良好答案。
我有一个包含列的订单表
(id, merchant_id, section_id, status_id, created_date, invoice_date, shipped_date, ...<other data columns> )
id是自增主键。
我将运行以下形式的查询:
SELECT id
FROM Orders
WHERE merchant_id=?
AND section_id=?
AND status_id=?
ORDER BY invoice_date LIMIT 25
id的层次结构是,merchant_id包含多个section_id,每个section_id包含多个status_id,每个status_id包含一堆订单。用户只能看到特定的merchant_id、section_id、status_id 组合中的订单。默认情况下,用户会看到按发票日期排序的订单
这导致了明显的索引:
(merchant_id, section_id, status_id, invoice_date)
这将为我提供过滤列的覆盖索引以及排序。
但是 - 用户也可以在查看页面时更改排序顺序。因此,上面的同一查询不是按发票日期排序,而是按发货日期或创建日期排序。它仍然会受到merchant_id、section_id 和status_id 过滤器的限制。
这是否意味着我还需要索引
(merchant_id, section_id, status_id, shipped_date)
以及
(merchant_id, section_id, status_id, created_date)
如果是这样,MySQL 是否会利用这些索引共享相同的最左边的 3 列这一事实,或者我是否会在更新/插入时遭受与 3 个不同索引一样多的惩罚?
在磁盘使用方面怎么样 - 最左边的 3 列是否会为每个索引重复?
对于这种类型的场景(多个索引共享一些相同的最左侧列)是否有更好的解决方案或方法?
最佳答案
尝试创建一个索引(merchant_id、section_id 和 status_id)。即使具有不同的 order by
条件,这对于所有不同的查询都应该很有用。
关于mysql - 在 MySQL 中创建仅在最右边(排序)列不同的多列索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22175105/