当我在MySQL查询上运行EXPLAIN
命令时:
EXPLAIN SELECT colZ FROM table1, table 2
WHERE table1.colA = table2.colA
AND table1.colB = table2.colB
AND table1.colC = X
EXPLAIN
命令指出possible_keys
包括:
colA, colB, colC
但实际的密钥用作colA
问题:这是否意味着我应该对所有三个组合列进行索引?指数(colA,colB,colC)?
答案 0 :(得分:2)
查看您的查询,您将获得以下表现:
表2上的索引(ColA,ColB)
表1中的指数(ColA,ColB,ColC,ColZ)
这些索引将允许仅对索引进行ColZ查找,并且应该是v.fast
答案 1 :(得分:1)
是的,我建议您创建组合索引
答案 2 :(得分:1)
如果您创建覆盖索引 - 即确保数据库引擎可以仅从索引中检索所有需要的信息 - 那么这应该使优化器的生活更轻松。在您的情况下,它需要涵盖WHERE
子句中的列(colA
上的索引,colB
中的colC
,table1
中的colA
; {1}},colB
中的table2
。
保留此索引/索引将需要一定的开销,但是额外维护的优势是否特定于您的设置(INSERT与SELECT等等。)
答案 3 :(得分:0)
正确答案取决于各列的选择性。特别是table1.col1C有多少个不同的值?如果总共有两个值(例如整个表中的'M'和'F',那么你最好不要在组合索引中包含它。但是,如果有的话,那么大约有三分之一的值。 col1C因为table2中有行,所以只有table1.col1C上的索引可能会给出非常快速的结果。
如果优化器可以在table1中找到三行而不进行任何连接,然后执行三次查找连接以获得table2中的匹配行,那将非常非常快。
除了广泛了解优化器的工作原理以及对数据填充的广泛分析之外,您最好尝试一些替代方案并运行基准测试。
这是个好消息:您可以随时更改索引设计。