这可能在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新手...
答案 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'