我创建了一个包含 10 万行的测试表。此查询的执行时间:
SELECT id FROM table
是0.032s
。如果我为索引为 Normal,BTREE
的整数列添加 GROUP BY
语句,查询的执行时间:
SELECT id FROM table GROUP BY indexedColumn
解释输出:
id | select_type | table | type | possible keys | key | key_len | ref | rows | Extra
1 SIMPLE [table] All [indexedColumnKey] null null null 105416 Using temporary; Using filesort
是0.073s
。由于 GROUP BY
,执行时间加倍,但我假设这是正常的?我的问题是,为什么将 LIMIT
添加到查询中,如下所示:
SELECT id FROM table GROUP BY indexedColumn LIMIT 500
解释输出:
id | select_type | table | type | possible keys | key | key_len | ref | rows | Extra
1 SIMPLE [table] index [indexedColumnKey] [indexedColumnKey] 5 null 500 null
将执行时间增加到 0.301s
?这是超过 4 倍的减速。
我对 SQL 非常缺乏经验,所以这可能是完全正常的,但对我来说,限制返回的行数会大大降低查询速度似乎有悖常理。
问题:
- 这正常吗?
- 有什么方法可以阻止 LIMIT 大大降低查询速度吗?
最佳答案
查询 SELECT id FROM table GROUP BY indexedColumn
不使用索引。它显示在您的解释中。但是当你使用 limit 时,就会使用索引。
此外,对于实验,您可以使用 SQL_NO_CACHE SELECT SQL_NO_CACHE ....
关于mysql - 如何阻止 LIMIT 减慢查询速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21064486/