数据库 - 多列索引

时间:2009-12-22 08:38:27

标签: mysql database database-design

当我在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)?

4 个答案:

答案 0 :(得分:2)

查看您的查询,您将获得以下表现:

表2上的索引(ColA,ColB)

表1中的指数(ColA,ColB,ColC,ColZ)

这些索引将允许仅对索引进行ColZ查找,并且应该是v.fast

答案 1 :(得分:1)

是的,我建议您创建组合索引

答案 2 :(得分:1)

如果您创建覆盖索引 - 即确保数据库引擎可以仅从索引中检索所有需要的信息 - 那么这应该使优化器的生活更轻松。在您的情况下,它需要涵盖WHERE子句中的列(colA上的索引,colB中的colCtable1中的colA; {1}},colB中的table2

保留此索引/索引将需要一定的开销,但是额外维护的优势是否特定于您的设置(INSERT与SELECT等等。)

答案 3 :(得分:0)

正确答案取决于各列的选择性。特别是table1.col1C有多少个不同的值?如果总共有两个值(例如整个表中的'M'和'F',那么你最好不要在组合索引中包含它。但是,如果有的话,那么大约有三分之一的值。 col1C因为table2中有行,所以只有table1.col1C上的索引可能会给出非常快速的结果。

如果优化器可以在table1中找到三行而不进行任何连接,然后执行三次查找连接以获得table2中的匹配行,那将非常非常快。

除了广泛了解优化器的工作原理以及对数据填充的广泛分析之外,您最好尝试一些替代方案并运行基准测试。

这是个好消息:您可以随时更改索引设计。