我有一个包含两列的表: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
答案 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
上的单列索引在此查询中没有任何用处。