关于mysql索引,多列还是一个?

时间:2009-11-26 15:15:00

标签: sql mysql optimization indexing

我有一个像这样的SQL:

SELECT * FROM tableA WHERE column_a = sth AND colun_b > sth

那么,我该如何为它创建索引?

  • 两列的一个索引
  • 每列的两个索引

哪个更好?

4 个答案:

答案 0 :(得分:3)

如果您正在针对该一个查询进行优化,那么a将是最佳优化。您的WHERE子句将首先检查column_a,如果不匹配则继续到下一行。如果 匹配column_b,它只会检查column_a。因此,您希望首先按column_a排序,然后按column_b排序,而不是两个单独的索引。

考虑这个而不是OR子句,你通常需要两个单独的索引,因为OR说,“首先选择column_a的所有匹配项然后独立地选择column_b的所有匹配,最后将结果集合并在一起“。由于该查询在检查column_a时未使用column_b的反馈,因此您希望在那里使用不同的索引。

另请注意,这些都是用非常笼统的术语编写的。根据您的数据情况,这些事情可能会因具体情况而异。一个好方法是创建一个索引,查看性能如何,删除它,创建另一个,并选择最佳性能。

答案 1 :(得分:1)

要记住的是,同一索引中2个或更多列的MySql索引的工作是为了使您的索引成为可能。

因此要进行优化,必须先将column_a放在索引中,然后再放入colun_b。 这是为了避免表扫描。

答案 2 :(得分:0)

要获得更好的阅读效果,如果您的查询同时包含两个比较,那么您应该在两列上有一个索引。

但是,如果您的查询在where子句中只有第二列,则可以在第二列上创建另一个索引。

答案 3 :(得分:0)

您想要一个可以进行RANGE SCANNED的索引。使用EXPLAIN(参见文档),这是你的朋友。

在这种情况下,column_a,column_b的索引应该能够进行范围扫描,但始终要检查EXPLAIN。在具有与生产系统相同的模式和数据量/分布的非生产数据库上使用EXPLAIN(将)