Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 使用索引优化带顺序的SELECT语句_Mysql - Fatal编程技术网

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