mysql order by+limit降低查询速度

mysql order by+limit降低查询速度,mysql,Mysql,似乎使用order by+limit非常慢,使用order by有点慢,而使用just limit非常快。这些查询的解释都使用filesort。like在两端“%search%”都是通配符,所以我知道它不能使用索引 我不明白为什么一个有限制的订单比一个有限制的订单慢得多 如果我有以下查询,大约需要250毫秒:有多个相同格式的类似查询。这使用了orderby和limit。最慢的 $this->db->select('category'); $this->db->from('

似乎使用order by+limit非常慢,使用order by有点慢,而使用just limit非常快。这些查询的解释都使用filesort。like在两端“%search%”都是通配符,所以我知道它不能使用索引

我不明白为什么一个有限制的订单比一个有限制的订单慢得多

如果我有以下查询,大约需要250毫秒:有多个相同格式的类似查询。这使用了orderby和limit。最慢的

$this->db->select('category');
$this->db->from('items');
$this->db->where('deleted',0);
$this->db->distinct();
$this->db->like('category', $search);
$this->db->order_by("category", "asc");
$this->db->limit($limit);
如果我有下面的查询,大约需要65毫秒,有多个相同格式的类似查询。这只使用最快的限制

$this->db->select('category');
$this->db->from('items');
$this->db->where('deleted',0);
$this->db->distinct();
$this->db->like('category', $search);
$this->db->limit($limit);
如果我有以下查询,大约需要75毫秒,有多个相同格式的类似查询

$this->db->select('category');
$this->db->from('items');
$this->db->where('deleted',0);
$this->db->distinct();
$this->db->like('category', $search);
$this->db->order_by("category", "asc");
此查询的工作方式如下:

MySQL使用索引或序列扫描扫描表项

当类别与$search等条件类别匹配时,MySQL会将此记录返回给您

当达到$limit时,MySQL停止执行。事情进展得很快。我想在你的测试中,美元限额并没有那么大

但使用ORDER BY的查询以其他方式执行:

$this->db->select('category');
$this->db->from('items');
$this->db->where('deleted',0);
$this->db->distinct();
$this->db->like('category', $search);
$this->db->order_by("category", "asc");
$this->db->limit($limit);
MySQL使用索引或序列搜索将表项扫描到表的末尾

当类别匹配条件类别(如$search)时,MySQL会将此记录存储在临时文件或内存缓存的某个位置

MySQL对临时文件或内存缓存中的所有记录进行排序

使用序列扫描,它从缓存中读取$limit记录并将其返回给您

在第一个查询中,MySQL进行最小$limit比较。在第二个查询中,MySQL和表中的记录一样多地进行比较,然后对数据进行排序,我假设有一个大的记录集

对不起,这不是你问题的答案

在文本文件中编写所有这些查询,不要使用框架,测试它们并查看解释。
当您添加“限制”时,MySQL可能会改变策略。

Order by需要对整个结果集进行排序。这需要时间。limit只会在SQL引擎遇到行时返回行。您可以尝试添加包含已删除列的索引、类别,或仅包含列类别的索引。您可能希望对类别列进行索引,以改进使用按类别排序的查询。您省略了$this->db->select'category';在最后一个查询中。您是否在没有选择的情况下测试了此查询。如果在最后一个选项中添加select,会发生什么情况query@GordonLinoff我的主要问题是,为什么添加到order by查询中的限制会大大降低性能。他的问题是,为什么使用limit和order by的查询比仅使用order by的查询速度慢。直觉告诉我们,使用限制可以加快查询速度,因为返回行所需的i/o更少。
$this->db->select('category');
$this->db->from('items');
$this->db->where('deleted',0);
$this->db->distinct();
$this->db->like('category', $search);
$this->db->order_by("category", "asc");
$this->db->limit($limit);