2016-12-01 18 views
2

假设我有一个表(T1)与3列(C1,C2,C3),和我加入这样一个指标:如果是查询的最后一个字段,MySQL是否必要索引表中的一列?

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" 

回答

1

只是为了让事情变得简单的exisiting指数将仍然可以使用,但是第三栏将独立解决。查询处理器将生成一些计划,并且引擎将接受最佳计划以继续。仍然以第三栏作为索引,肯定会夸耀其表现。

建议 如果您使用的平等条件查询随时随地基于散列索引而非B树

+1

感谢您的回答,让我编辑帖子。看看更新,最后一个查询使用'>'运算符作为日期。我认为这不是一个好主意索引一个日期,所以我想用前两列来优化搜索,然后根据日期查看结果的大小要小得多。 – Fco

+0

据我所知,索引只有两个。随着更多字段的更新和更多空间的消耗,写入操作将需要更多时间。除此之外,我没有看到问题。如果所有三个在查询中运行,我也没有看到制作第三列索引的问题。但是如果你的系统在现有设计下工作的很好,那么现在就不要改变它。 –

+0

对于点查询,哈希索引只比Bree稍快。但是Hash在MySQL中不可用。 (好的,有一个例外。) –

0

This cookbook提供了所有这些问题的答案,加上许多。

  • INDEX(c1, c2)(以任一顺序)适用于所有这些情况;
  • (c1, c2, c3)适用于所有这些情况;对第二和第三更好。同上(c2, c1, c3)
  • 其他排序不会为你的第三个查询都很好 - 在=部分必须是第一位的,而不是一个“范围”(如>

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

相关问题