假设我有一个包含3列(c1,c2,c3)的表(t1),并且我添加了这样的索引:
ALTER TABLE `t1` ADD INDEX `IDX_c1_c2` USING BTREE (`c1`, `c2`);
我知道,如果我使用索引并使用完美:
SELECT * FROM `t1` where c1 = "foo" AND c2 = "bar"
但是,这个查询呢?:
SELECT * FROM `t1` where c1 = "foo" AND c2 = "bar" AND c3 = "foobar"
MySQL引擎会使用索引来改进查询还是会忽略索引?我的意思是,整个查询必须与索引匹配才能使用索引,或者我可以利用查询前两列的索引。
[更新] - 事实上,最后一个查询看起来像这样(日期只是一个例子):
SELECT * FROM `t1` where c1 = "foo" AND c2 = "bar" AND c3 > "2016-11-26 07:37:47"
答案 0 :(得分:1)
为了简单起见,您仍然会使用现有索引,但第三列将会独立解决。查询处理器将生成一些计划,引擎将接受最佳计划以继续。仍然将第三列作为索引也绝对会夸耀其表现。
<强>建议强> 如果在查询中使用相等条件,则使用基于散列的索引而不是Btree
答案 1 :(得分:0)
This cookbook提供了这些问题的所有答案以及更多问题。
INDEX(c1, c2)
(按任意顺序)适用于所有这些案件; (c1, c2, c3)
适用于所有这些案件;并且对于第二和第三更好。同上(c2, c1, c3)
。=
部分必须首先出现,而不是'范围'(例如>
)奖励:如果表格中只有那3列,那么(c1, c2, c3)
就是“覆盖”。这意味着它可以在索引BTree中执行整个查询,而不需要触摸数据BTree。