MySQL:获取最新记录的最佳实践

4

我有一个关于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个”真的可以很快吗?我错在哪里了?

在编辑之前,是否将“AND another_table.some_interesting_property”与某个值进行了比较? - Lynette Duffy
3个回答

0

我在重现你的情况时遇到了麻烦。无论我在huge_table/another_table模拟中使用ASC还是DESC,我的EXPLAIN和执行时间都显示大约读取了N行和一个逻辑连接。你使用的MySQL版本是哪个?

此外,从docEXPLAIN中可以看出,Using index表示:

仅使用索引树中的信息从表中检索列信息,而不必进行额外的查找以读取实际行

这与你执行SELECT *的事实不符,除非你有一个覆盖整个表的索引。

也许你应该展示你的架构,包括索引和EXPLAIN输出。


0

通过使用 join,您现在将行限制为“some_interesting_property”,并且您的 huge_table 中的 ID 可能不再是连续的... 尝试在 another_table(some_interesting_property、id)和 huge_table(another_table_id、id)上创建索引,并查看您的 EXPLAIN 是否给出更好的提示。


0

从您的链接中:index_col_name规范可以以ASC或DESC结尾。这些关键字允许将来扩展,用于指定升序或降序索引值存储。目前,它们被解析但被忽略;索引值始终按升序存储。 - Julien Palard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接