使用索引使用ORDER BY优化SELECT语句

时间:2016-11-19 10:08:14

标签: mysql

我有这些疑问:

第一次查询:

SELECT (..) FROM db WHERE A = const AND B > const AND C >= const ORDER BY B DESC LIMIT const

第二个查询(不同的数据库):

SELECT (...) FROM db' WHERE A' = const ORDER BY X' DESC LIMIT const

关于第一次查询的问题: 由于ORDER BY语句,是否足以拥有多行索引(A,B,C)或是否需要额外的单行索引(B)(或不同的索引)?

关于第二个查询的问题:我是否需要多行索引(A',X')或两个单行索引(A'),(X')才能在此查询中使用它们?

1 个答案:

答案 0 :(得分:2)

重要的是要知道MySQL每个表和子查询最多只能使用一个索引(用于搜索,过滤和排序)(基本上每行explain),所以你只能使用一个索引这里。

对于第一个查询,索引(A,B)将允许MySQL进行范围扫描并使用该顺序。如果使用(A,B,C),则列C不能在范围条件中使用(因为B已经是范围),但MySQL将节省读取实际tabledata的时间以获得C的值以检查最后一个条件。所以(A,B,C)通常是这里最快的选择。

"通常",因为你当然可以有一个数据分布,其中另一个索引是最好的:如果你是只有一行或两行匹配C >= const和10M +行A = const,使用C上的索引最快。如果C是一个非常大的列(例如varchar(700)),它可能会炸毁索引并降低其速度。但要估计此类异常需要更深入的数据知识。

对于第二个查询,(A', X')将是最佳选择。如果您有两个索引(A')(X'),那么在大多数情况下MySQL都会(除非A'是唯一的,但不管怎么说你都不需要order by)使用X'上的索引,希望它很快找到A'的匹配行。如果您只有一些匹配A' = const的行(因为它必须按照{{1}的顺序在表中来回跳转(由主键排序),这有时会出乎意料地且非常缓慢。找到符合X'条件的行。

如果您有索引A'(A)(但不是(B)(A,B)),您的第一个查询可能会遇到同样的问题:MySQL可能会使用(A,B,C)代替(B)(但请检查(A)以确保)。即使您现在只添加一个索引,也可以例如当您添加索引explain以在下周优化其他查询并忘记此查询时会发生这种情况,因此我建议坚持(至少)(B)

相关问题