mysql order by + limit减慢查询速度

时间:2014-03-01 15:43:00

标签: mysql

似乎使用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");

1 个答案:

答案 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);

此查询以这种方式工作:

  1. MySQL扫描表items使用索引或使用序列扫描。

  2. 当类别与条件category LIKE $search匹配时,MySQL会将此记录返回给您。

  3. 达到$ limit时,MySQL会停止执行。这很快。 (我认为$limit在你的测试中没那么大)

  4. 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);
    
    1. MySQL扫描表items使用索引或使用序列搜索到表的末尾。

    2. 当类别与条件category LIKE $search匹配时,MySQL会将此记录存储在某处(临时文件或内存缓存)

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

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

    5. 在第一个查询中,MySQL执行最小$ limit比较。在第二个查询中,MySQL与表中的记录进行比较,然后排序(我假设)一个大记录集。

      UPD 抱歉,这不是你问题的答案。

      将所有这些查询写入文本文件(不要使用框架)并测试它们并查看EXPLAIN。 当你添加'LIMIT'时,MySQL可能会改变策略