我有这些疑问:
第一次查询:
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')才能在此查询中使用它们?
答案 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)