Mysql 为什么';使用索引条件';即使条件在索引内?
有一个使用两列的慢速查询,所以决定添加一个复合索引并改变排序。现在效果很好。执行时间从将近一分钟下降到不到一秒。但是Mysql 为什么';使用索引条件';即使条件在索引内?,mysql,indexing,Mysql,Indexing,有一个使用两列的慢速查询,所以决定添加一个复合索引并改变排序。现在效果很好。执行时间从将近一分钟下降到不到一秒。但是explain输出仍然显示“使用索引条件”。为什么? 查询: SELECT * FROM TableA WHERE source = 'book' AND uuid = 999 ORDER BY uuid ASC; 表列: 索引: 解释输出: 解释并分析输出: ->使用source_uid_Index(source='book')在表A上进行索引查找,索引条件为:(
explain
输出仍然显示“使用索引条件”。为什么?
查询:
SELECT *
FROM TableA
WHERE source = 'book' AND uuid = 999
ORDER BY uuid ASC;
表列:
索引:
解释输出:
解释并分析输出:
->使用source_uid_Index(source='book')在表A上进行索引查找,索引条件为:(table.uuid=999)(成本=33679.16行=170038)(实际时间=57.279..57.384行=4个循环=1)
解释数据说它使用的是综合指数,这是有道理的。然而,解释分析也会说“带有索引条件:(table.uuid=999)
”
为什么它使用
uuid
作为“索引条件”,在source
旁边的索引中使用uuid?我找到了原因。
uuid
列的类型为varchar
。所以我问错了。这是正确的查询:
SELECT *
FROM TableA
WHERE source = 'book' AND uuid = '999'
ORDER BY uuid ASC;
解释输出:
你的意思是它为什么使用非综合指数?我想如果是这样的话,可能是因为你是按单个字段排序的。它实际上使用了复合索引,源索引不是应该用在where过滤中吗?这两种方法都在过滤,所以使用复合索引不是很自然吗?没错。那真的很好。“解释输出”上的“额外”列的值令我恼火。结果发现问题出在查询本身。uuid是一个varchar而不是int。谢谢你的帮助。@DavidS-你的自我回答才是真正的解决方案。很高兴你找到了它;我错过了。