我有一个关于mysql的辣问题...
这里的想法是从一个表中选择最后n条记录,通过一个属性进行过滤(可能来自另一个表)。很简单。
此时你想回复:
让 n = 10
SELECT *
FROM huge_table
JOIN another_table
ON another_table.id = huge_table.another_table_id
AND another_table.some_interesting_property
ORDER BY huge_table.id DESC
LIMIT 10
如果没有JOIN,MySQL会从末尾读取索引并返回10个项目,执行时间可以忽略不计。但是如果有JOIN,则执行时间将取决于表的大小,在许多情况下不可忽略,EXPLAIN语句显示MySQL正在使用“Using where; Using index; Using temporary; Using filesort”。
MySQL文档(http://dev.mysql.com/doc/refman/5.1/en/order-by-optimization.html)中指出:
“如果您要连接多个表,并且ORDER BY中的列并非全部来自用于检索行的第一个非常量表(这是在EXPLAIN输出中第一个没有const连接类型的表),则无法使用索引解决ORDER BY,MySQL会更倾向于使用大文件排序...”
这解释了为什么MySQL不能使用索引解决我的ORDER BY问题,而更倾向于使用大文件排序...
我的问题是:使用ORDER BY ... LIMIT 10获取最后几项是否是自然的?在按升序排列的牌堆中选择最后10张牌时是否真的这样做?个人认为最好直接从底部选择10个...
我尝试了许多可能性,但最终得出的结论是查询前10个元素非常快,而查询后10个元素则非常慢,因为有ORDER BY子句。“选择最后10个”真的可以很快吗?我错在哪里了?