似乎使用order by + limit非常慢,使用order by有点慢,并且使用just limit非常快。这些查询的解释都使用filesort。这样的两端'%search%'是狂野的,所以我知道它不能使用索引。
我不明白为什么带限制的订单比订单的速度慢得多。
如果我有以下查询,则需要大约250毫秒:(有多个类似的查询采用相同的格式)。这使用AND限制的顺序。 (最慢)
$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毫秒ms(有相同格式的多个类似查询)。这只使用LIMIT(最快)
$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毫秒ms(有相同格式的多个类似查询)
$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");
答案 0 :(得分:0)
$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);
此查询以这种方式工作:
MySQL扫描表items
使用索引或使用序列扫描。
当类别与条件category LIKE $search
匹配时,MySQL会将此记录返回给您。
达到$ limit时,MySQL会停止执行。这很快。 (我认为$limit
在你的测试中没那么大)
但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扫描表items
使用索引或使用序列搜索到表的末尾。
当类别与条件category LIKE $search
匹配时,MySQL会将此记录存储在某处(临时文件或内存缓存)
MySQL对临时文件或内存缓存中的所有记录进行排序
使用序列扫描,它会从缓存中读取$ limit记录并将它们返回给您。
在第一个查询中,MySQL执行最小$ limit比较。在第二个查询中,MySQL与表中的记录进行比较,然后排序(我假设)一个大记录集。
UPD 抱歉,这不是你问题的答案。
将所有这些查询写入文本文件(不要使用框架)并测试它们并查看EXPLAIN。 当你添加'LIMIT'时,MySQL可能会改变策略