我有一个像这样的SQL:
SELECT * FROM tableA WHERE column_a = sth AND colun_b > sth
那么,我该如何为它创建索引?
哪个更好?
答案 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(将)