MySQL如何在此示例中使用索引?

时间:2013-12-05 21:47:30

标签: mysql

这可能在MySQL文档中,但我一直无法找到它。所以我知道如果我从数据库中选择一条记录,那么最快的结果就是我选择的字段和WHERE子句中的字段是索引的一部分。假设我有这样的陈述:

SELECT a FROM t1 WHERE b=X AND c=Y

哪些键或键组合会给我最快的结果?

选项1:一个键是(a,b,c)。

选项2:一个键是(b,c),因为它们在where语句中。

选项3:一个键是(b,c,a),因为b和c在where语句中,a是最终需要查找的值。 (对我来说似乎很合乎逻辑,但我不知道这是否会让MySQL感觉到......)

选项4:两个键,一个是(b,c),另一个是(a)。

对不起,我是一个真正的MySQL新手...

1 个答案:

答案 0 :(得分:1)

在您的情况下,(b,c)上的复合索引应该可以胜任。您不需要a上的索引,因为它不在您的WHERE子句中。它在SELECT列表中的存在不会影响查询的其余部分的索引方式。

您也可以按顺序使用(b,c,a) ,因为MySQL将从左到右使用复合索引中的列组合。对于此用例而言,这不是必需的,但如果您确实需要查询所有三列,则可以在未来验证您的代码。由于这个原因,索引(a,b,c) 在此查询中工作。< / p>

WHERE b='X' AND c='Y' AND z='Z'

来自the MySQL docs on index usage

  

如果表具有多列索引,则优化程序可以使用索引的任何最左前缀来查找行。例如,如果在(col1,col2,col3)上有三列索引,则在(col1),(col1,col2)和(col1,col2,col3)上建立索引搜索功能。

与往常一样,如果有疑问,请在创建索引后检查查询的执行计划,以验证它是否可以按预期使用。

EXPLAIN SELECT a FROM t1 WHERE b='X' AND c='Y'