我创建了一个包含100k行的测试表。此查询的执行时间:
SELECT id FROM table
是0.032s
。如果我为索引为GROUP BY
的整数列添加Normal,BTREE
语句,则查询的执行时间为:
SELECT id FROM table GROUP BY indexedColumn
EXPLAIN输出:
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
EXPLAIN输出:
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非常缺乏经验,所以这可能是完全正常的,但对我来说,限制返回的行数对我来说似乎是违反直觉的。
问题:
答案 0 :(得分:0)
查询SELECT id FROM table GROUP BY indexedColumn
不使用索引。它在您的解释中显示。但是当你使用limit时,会使用索引。
此外,对于实验,您可以使用SQL_NO_CACHE SELECT SQL_NO_CACHE ....