【问题标题】:How to improve ORDER BY ... LIMIT ... query peformance?如何提高 ORDER BY ... LIMIT ... 查询性能?
【发布时间】:2014-12-13 17:09:14
【问题描述】:

我有一个包含两列的表: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

添加强制索引使用子句将在解释查询中得到完全相同的结果(使用文件排序):

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

【问题讨论】:

  • 嘿,你找到并阅读了这个答案吗:stackoverflow.com/questions/12148943/… ?
  • 有趣的主键默认是索引的,应该考虑索引。你能检查一下表上的索引吗show indexes from dedict_uniqueWF
  • 当你强制使用主要(SELECT ... FROM ... USE KEY FOR ORDER BY ...)时会发生什么?
  • @Abhik Chakraborty:我在主要问题中添加了显示索引

标签: mysql performance limit


【解决方案1】:

尝试使用延迟连接模式(如下所示)来加速此查询。事实上,您正在对大量数据进行排序。

这个查询

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 上的单列索引在此查询中没有任何用处。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-14
    • 2020-11-19
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多