2 列索引与 3 列索引的性能方面

Posted

技术标签:

【中文标题】2 列索引与 3 列索引的性能方面【英文标题】:2 column index vs 3 column index performance-wise 【发布时间】:2020-01-04 11:18:51 【问题描述】:

背景:

假设我有一个名为 mytable 的表,其中包含以下列:

    ID(唯一)

    user_id(字符串)

    creation_date(日期)

    已删除(布尔值)

    ...(更多不重要的列)

我的查询如下:

SELECT * FROM mytable
WHERE user_id = 'abcdefg1234567'
AND creation_date BETWEEN '2018-01-01 10:00:00' AND '2019-01-01 10:00:00';

我的问题:

这两个索引之间是否存在性能差异(执行我的特定查询时):

    (user_id, creation_date)

    (用户 ID,创建日期,已删除)

我希望回答这个问题时没有遗漏任何信息。

非常感谢!

【问题讨论】:

我有一个名为 mytable 的表,其中包含以下列 替换为 CREATE TABLE(可能会跳过不必要的字段,但必须显示索引和表选项)。 1. ID(唯一) 真的不是主要的吗? 这两个指标之间是否存在性能差异 如果使用指标(当然是单独使用) - 90% 的差异无法测量(小于测量精度),10% 的差异不存在完全没有。 【参考方案1】:

我不确定 GMB 的答案是否明确。任一索引都将用于查询。您不应该看到它们之间的任何性能差异。 (实际上第二个索引的开销可能会多一点,因为它在物理上更大。)

mysql 实际上在多列索引上有很好的documentation,这解释了它们是如何被使用的。

没有理由同时拥有两个索引。您可以简单地使用第二个,它将覆盖您查询的 where 子句。

【讨论】:

【参考方案2】:

查询过滤列user_idcreation_date。这当然会有益于(user_id, creation_date) 的索引(您问题中的选项1)。

MySQL 能够利用(user_id, creation_date, deleted) 上的索引,因为查询需要的列在索引定义中位于首位;如果是(deleted, user_id, creation_date),则查询不会利用它。

所以我认为这两种设置之间不会有显着的性能差异,现有的索引应该在两种情况下都使用;您可以通过生成每个语句的explain 计划来确认这一点。

【讨论】:

以上是关于2 列索引与 3 列索引的性能方面的主要内容,如果未能解决你的问题,请参考以下文章