Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.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 优化排序查询_Mysql_Sql_Optimization - Fatal编程技术网

Mysql 优化排序查询

Mysql 优化排序查询,mysql,sql,optimization,Mysql,Sql,Optimization,我找不到优化以下查询的方法: SELECT * FROM tbl WHERE type='51' AND `start`<='2012-01-19' ORDER BY end DESC LIMIT 5 我试着用一个单独的索引类型对每一列进行索引,开始、结束,并且所有列都在同一个索引中,但是MySQL一直告诉我需要进行文件排序 此查询是否无法优化?它在很大程度上取决于列类型和表中的所有内容,但您真正需要的是类型、开始和结束列的索引 为了获得额外的提升,您可以在类型和开始之间创建索引

我找不到优化以下查询的方法:

SELECT * 
FROM tbl 
WHERE type='51' AND `start`<='2012-01-19' 
ORDER BY end DESC 
LIMIT 5
我试着用一个单独的索引类型对每一列进行索引,开始、结束,并且所有列都在同一个索引中,但是MySQL一直告诉我需要进行文件排序


此查询是否无法优化?

它在很大程度上取决于列类型和表中的所有内容,但您真正需要的是类型、开始和结束列的索引


为了获得额外的提升,您可以在类型和开始之间创建索引。

是的,只要您在WHERE和sort by另一个字段中进行范围比较,mysql就不能使用索引进行排序


如果您在DESC末尾有WHERE type='51'和start='2012-01-19'的顺序,或者type='51'和start我的第一个想法是*正在扩展到没有索引的行

如果不是的话,你肯定会从中受益


我将尝试并学习如何在索引定义中创建列的顺序,以最小的基数近似列的唯一组合。

感谢您的所有回答,这让我了解了很多关于这个问题的知识

我终于明白了!看起来这实际上是可以优化的,或者至少可以在解释语句中使用filesort删除它

以下是我使用的索引:

    KEY `start` (`start`),
    KEY `typeend` (`type`,`end`)
现在执行:

    EXPLAIN  SELECT * 
    FROM tbl 
    WHERE type='51' AND `start`<='2012-01-19' 
    ORDER BY end 
    DESC LIMIT 5

我建议如下:

添加索引类型、结束、开始

重写查询:

SELECT *
FROM (
  SELECT id -- `id` is the primary key
  FROM tbl
  WHERE type='51' AND `start`<='2012-01-19' 
  ORDER BY end DESC
  LIMIT 5) as ids
JOIN tbl
USING (id); -- `id` is the primary key

表中有多少行?该表包含大约40000行。单独索引没有帮助。Mysql一次只能使用一个索引。我会尝试并学习如何创建具有最低基数的列顺序,以及列的唯一组合。-这与原始问题无关。你希望我的回答是否,优化并非不可能:只回答“实际”问题?我已经给出了答案。你的答案包含了不相关的信息。是的,最好说“不”,而不是给出毫无用处的建议。与问题中的时间相比,in现在需要多长时间?好吧,时间几乎是一样的,因为这里我们处理的数据量非常小,只有40K行,整个表的大小小于3MB,但我认为这是一个很好的例子,因为我有很多这样的案例,有更大更复杂的表,现在我可以开始处理它们了
SELECT *
FROM (
  SELECT id -- `id` is the primary key
  FROM tbl
  WHERE type='51' AND `start`<='2012-01-19' 
  ORDER BY end DESC
  LIMIT 5) as ids
JOIN tbl
USING (id); -- `id` is the primary key