表有两列:
CREATE TABLE items (
k INT auto_increment PRIMARY KEY,
val INT UNSIGNED
) ENGINE=MyISAM;
我在表格中放了四个项目:
INSERT INTO items (val) VALUES (12),(23),(45),(56);
现在,如果我这样做:
EXPLAIN SELECT * FROM items ORDER BY k;
我得到了可怕的“使用filesort”。这是怎么回事?根据{{3}},它应该使用索引进行排序。我做错了吗?
在XP上测试MySQL 5.0.41,在ubuntu上测试5.0.67。
UPDATE :我在表格中添加了1,110,000行,我添加了一个VARCHAR列并用文本填充。表大小现在是135MB,我还在“使用filesort”。
答案 0 :(得分:3)
好吧,也许,也许,它足够聪明地弄清楚整个表可以放在一个块中而且它不会费心阅读索引。将整个表读入内存并对其进行排序可能会更快(如果这甚至是必要的话 - 它很可能已经按块中的键排序了。)
尝试使用更大的桌子。
答案 1 :(得分:2)
您可以使用以下方式强行使用:
EXPLAIN SELECT k, val FROM items FORCE INDEX(PRIMARY) ORDER BY k
我认为这可能是与索引大小等相关的MyISAM问题。
如果您创建与InnoDB相同的表并运行原始订单,则使用PRIMARY索引可以正常工作。