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 列索引的性能方面的主要内容,如果未能解决你的问题,请参考以下文章

pandas读取csv数据header参数指定作为列索引的行索引列表形成复合(多层)列索引使用iloc基于行索引位置列表筛选dataframe数据中指定位置的多个数据行

pandas读取csv数据header参数指定作为列索引的行索引列表形成复合(多层)列索引使用set_index函数把数据列转化为行索引(keys参数指定需要被转化的层列索引)

pandas读取csv数据header参数指定作为列索引的行索引列表形成复合(多层)列索引使用set_index函数把数据列转化为行索引(keys参数指定需要被转化的层列索引)

pandas读取csv数据header参数指定作为列索引的行索引列表形成复合(多层)列索引使用xs函数获取行切面数据(level参数指定行层索引列表key参数指定索引值列表)

列索引的最佳数据库策略是啥?

基于列索引的 Spark Dataframe 选择