【发布时间】:2014-12-05 19:39:26
【问题描述】:
我有一个这样定义的表:
`id` int(10) NOT NULL AUTO_INCREMENT,
`slug` varchar(150) NOT NULL,
`title` varchar(150) NOT NULL,
`description` text NOT NULL,
`ordinal` int(10) NOT NULL DEFAULT '0'
我们称之为t1
在 t1 中,我在 ordinal 上有一个索引。
这个表只包含几行,它是一个定义表,所以我通常这样做,以按我想要的顺序获取定义
SELECT * FROM t1 WHERE 1 ORDER BY ordinal;
如果我对该语句执行 EXPLAIN,我会得到以下信息:
id? select_type? table? partitions? type? possible_keys? key? key_len? ref? rows? Extra?
1 SIMPLE t1 NULL ALL NULL NULL NULL NULL 5 Using where; Using filesort
上面的行是否对齐并不重要。重要的是它使用了文件排序,我不知道为什么。
由于该表中只有 5-10 行,因此可能感觉它并不重要,但文件排序让我的 open_tables 变得有点糟糕,因为 MySQL(根据强大的互联网)打开了两个表对于它需要执行的每个文件排序查询。
所以,非常感谢这里的任何帮助。谢谢。
【问题讨论】:
-
您有 5 行。我想在这么小的数据集上使用索引不会被打扰
-
计划注释“使用 where”,这有点危险,因为每一行都满足您的
WHERE子句。在分析如何以及是否使用索引时,优化器可能会专注于连接和选择谓词。可能您的索引被忽略了,因为它对这些没有帮助。完全删除WHERE可能会说服它考虑使用索引来协助ORDER BY。或者,由于只有几行并且 MySQL 必须全部读取它们,因此直接对它们进行排序可能会更快。 -
约翰:你可能是对的。删除“where 1”并没有帮助。奇怪的是,我真的只是希望它不要像为文件排序那样创建一个 tmp 表,因为我有一个“打开表”问题,这似乎部分来自这些具有文件排序的查询。