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

标签 mysql sql sorting indexing

我在应用程序中遇到了一个场景,无法找到有关使用多列索引的良好答案。

我有一个包含列的订单表

(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/

相关文章:

PHP MySQL设置/配置表调用值

algorithm - 给出一个测试用例,其中堆排序从 Introduction to Algorithm 失败

python 对以数字开头的字符串进行排序

mysql - 如何从基于单列的 SQL 查询中删除重复项

mysql - 将C代码的输出重定向为MySQL服务器的输入

php - Mysql CURDATE() 不适用于时间戳类型

matlab - 如何更改 Matlab 图中线条的顺序?

SQL多表更新语法

sql - 如何使用 SQL 对 varchar 中的 varchar 进行计数

sql - 滚动日期范围内的 BigQuery 非重复计数,列上有分区