如何改进ORDER BY ... LIMIT ...查询性能?

时间:2014-12-13 17:09:15

标签: mysql performance limit

我有一个包含两列的表:id(主键)和writtenForm(VARCHAR 255)。行总数约为850.000。

我需要执行以下查询:

SELECT writtenform FROM `dedict_uniqueWF` order by id LIMIT 1,20000

此查询需要10分钟以上。当我运行解释查询时,它似乎没有使用索引。知道为什么吗?

解释查询:

id  select_type     table               type    possible_keys   key     key_len     ref     rows    Extra
1   SIMPLE          dedict_uniqueWF     ALL     NULL            NULL    NULL        NULL    836753  Using filesort

解释表:

Field           Type            Null    Key     Default     Extra
id              int(11)         NO      PRI     NULL        auto_increment
writtenForm     varchar(255)    YES     NULL

与此同时,我添加了一个新索引。解释查询中的结果仍然相同。 显示索引:

Table               Non_unique      Key_name        Seq_in_index        Column_name     Collation       Cardinality     Sub_part        Packed      Null    Index_type  Comment     Index_comment
dedict_uniqueWF     0               PRIMARY         1                   id              A               836753          NULL            NULL                BTREE
dedict_uniqueWF     1               writtenForm     1                   writtenForm     A               836753          NULL            NULL        YES     BTREE

添加强制索引使用子句将在解释查询(使用filesort)中具有完全相同的结果:

explain SELECT writtenform FROM `dedict_uniqueWF` use index(PRIMARY) order by id LIMIT 1,20000

1 个答案:

答案 0 :(得分:2)

尝试使用延迟连接模式,如下所示,以加快此查询。事实上,你正在分类大量的数据。

此查询

SELECT id FROM dedict_uniqueWF ORDER BY id LIMIT 1,20000

为您提供所需的ID。

然后,此查询使用该id列表仅访问所需的行。

SELECT writtenform
  FROM dedict_uniqueWF
  JOIN (
           SELECT id FROM dedict_uniqueWF ORDER BY id LIMIT 1,20000
       ) AS a ON dedict_uniqueWF.id = a.id
 ORDER BY a.id

获取结果集。看,20K行的结果集非常大,可能还需要一段时间来生成并从MySQL服务器传递到您的应用程序。

您还可以在(id, writtenform)上尝试使用复合索引来加速此查询。 writtenform上的单列索引在此查询中没有任何用处。