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_id
和creation_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参数指定索引值列表)