如果是查询的最后一个字段 - MySQL,是否必须索引表的列?

时间:2016-12-01 18:33:45

标签: mysql sql hibernate indexing

假设我有一个包含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"

2 个答案:

答案 0 :(得分:1)

为了简单起见,您仍然会使用现有索引,但第三列将会独立解决。查询处理器将生成一些计划,引擎将接受最佳计划以继续。仍然将第三列作为索引也绝对会夸耀其表现。

<强>建议 如果在查询中使用相等条件,则使用基于散列的索引而不是Btree

答案 1 :(得分:0)

This cookbook提供了这些问题的所有答案以及更多问题。

  • INDEX(c1, c2)(按任意顺序)适用于所有这些案件;
  • (c1, c2, c3)适用于所有这些案件;并且对于第二和第三更好。同上(c2, c1, c3)
  • 其他排序不适用于您的第三个查询 - =部分必须首先出现,而不是'范围'(例如>

奖励:如果表格中只有那3列,那么(c1, c2, c3)就是“覆盖”。这意味着它可以在索引BTree中执行整个查询,而不需要触摸数据BTree。