【发布时间】:2016-06-05 21:17:18
【问题描述】:
我的数据集的简化版本:
我有一张有两列 col1 和 col2 的表格
我想优化这个查询:
SELECT * FROM mytable a
LEFT JOIN mytable b
ON a.col1 = b.col2
在此表上创建的最佳索引是什么?
- 两个索引:
col1上的索引和col2上的另一个索引 - 一个双索引:两个索引
col1,col2
让我们稍微复杂一点:(我的真实数据结构)
假设我的表中还有一列extract_date:
SELECT * FROM mytable a
LEFT JOIN mytable b
ON a.col1 = b.col2 AND a.extract_date=b.extract_date
在此表上创建的最佳索引是什么?
- 两个双索引:
col1,extract_date上的 index1 和col2,extract_date上的另一个索引 - 一个三重索引:
col1,col2,extract_date上的索引
【问题讨论】:
-
基本经验法则:在“决策上下文”中使用的任何字段:where 子句、order by、group by 等都应该被索引。您如何着手构建这些索引。
-
我不同意...我看到有一些指导方针取决于数据集的粒度,以及 MySQL 是否决定使用它
-
好吧,是的,如果它是一个 10 条记录的表,索引将是多余的。
-
我说的是数百万行。粒度是指每列的不同值:col1 有 10 个不同的值,col2 有 1000 个不同的值
-
那么索引在大多数情况下仍然会有所帮助。没有硬性/快速规则说“类型 X 和数量 Y 的索引将导致 Z% 的性能提升”。您必须以两种方式对其进行测试。如果您的特定数据集证明索引没有帮助,那么不要浪费创建/维护该索引的开销。