Mysql 使用索引优化带顺序的SELECT语句
我有以下疑问: 第一个问题:Mysql 使用索引优化带顺序的SELECT语句,mysql,Mysql,我有以下疑问: 第一个问题: SELECT (..) FROM db WHERE A = const AND B > const AND C >= const ORDER BY B DESC LIMIT const 第二次查询(不同数据库): 关于第一项质询的质询: 有一个多行索引(a、B、C)就足够了吗?还是因为ORDER BY语句,我需要一个额外的单行索引(B)(或一个不同的索引) 关于第二次查询的问题:我需要一个多行索引(a',X')还是两个单行索引(a',X')来让我们在这
SELECT (..) FROM db WHERE A = const AND B > const AND C >= const ORDER BY B DESC LIMIT const
第二次查询(不同数据库):
关于第一项质询的质询:
有一个多行索引(a、B、C)就足够了吗?还是因为ORDER BY
语句,我需要一个额外的单行索引(B)(或一个不同的索引)
关于第二次查询的问题:我需要一个多行索引(a',X')还是两个单行索引(a',X')来让我们在这个查询中使用它们?重要的是要知道,MySQL将在每个表和子查询(基本上是在
explain
中的每行)中最多使用一个索引(用于搜索、过滤和排序),因此,这里只能使用一个索引
对于第一个查询,索引(A,B)
将允许MySQL进行范围扫描并使用顺序。如果使用(A,B,C)
,则列C
不能在范围条件中使用(因为B
已经是一个范围),但MySQL将节省时间读取实际的表格数据,以获取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
匹配的行(因为它必须按照X'
的顺序在表中来回跳转(按主键排序)才能找到与A'
的条件匹配的行),那么这有时会出乎意料地缓慢
如果您有索引
(A)
和(B)
(但不是(A,B)
或(A,B,C)
),第一次查询可能会遇到同样的问题:MySQL可能会使用(B)
而不是(A)
(但请检查解释,以确保)。即使您现在只添加了一个索引,例如,当您添加索引(B)
以优化下周的另一个查询而忘记了此查询时,也会发生这种情况,因此我建议(至少)坚持使用(a,B)
,这实际上取决于过滤器的卷和生成的行,其中a=const
。如果返回1000行,您真的不需要在X'
上建立索引,也不需要在B
和C
上建立索引来帮助再次筛选结果。如果是数百万行,那就不同了。你应该发布你的解释计划,否则我们就无话可说了。这可能是我想问的另一个问题,但我在这个例子中的假设是,我需要索引,我想知道MySQL是否需要(A,B,C)或(A,B),(C)索引,如果存在orderbyc
,如果存在针对1的过滤器。A、 B、C或2。只是A和B,但要回答您的第一个问题:我的过滤器总是将结果减少到远低于1000行的集合,因此我不会使用B和C作为索引。谢谢你的信息
SELECT (...) FROM db' WHERE A' = const ORDER BY X' DESC LIMIT const