Mysql:获取最后记录的最佳做法

时间:2010-09-10 07:35:12

标签: mysql query-optimization sql-order-by

我有一个关于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个项目,执行时间可以忽略不计 使用连接,执行时间取决于表的大小,并且在许多情况下不可忽略,解释说mysql是:“使用where;使用索引;使用临时;使用filesort”

MySQL文档(http://dev.mysql.com/doc/refman/5.1/en/order-by-optimization.html)声明:

  

“您正在加入许多表,并且ORDER BY中的列不是来自用于检索行的第一个非常量表。(这是EXPLAIN输出中没有const连接类型的第一个表。)“

解释为什么MySQL不能使用索引来解析我的ORDER BY而不喜欢大文件排序...

我的问题是:使用ORDER BY ... LIMIT 10来获取最后一项是否自然?在升序卡片组中挑选最后10张牌时,你真的这样做了吗?就个人而言,我只是从底部挑选了10个......

我尝试了很多种可能性,但所有结果都给出了这样的结论:我很快就能查询10个第一个元素,并且慢慢地查询10个ORDER BY子句的最后一个原因。

“选择最后10个”真的可以快吗?我哪里错了?

3 个答案:

答案 0 :(得分:0)

好问题,我认为你应该按列排序,即id为DESC索引  这应该可以解决问题 http://dev.mysql.com/doc/refman/5.0/en/create-index.html

答案 1 :(得分:0)

我在复制你的情况时遇到了麻烦。我的ASC / DESC模拟使用huge_tableanother_table,我的EXPLAIN和执行时间都显示大约N行和逻辑连接。您使用的是哪个版本的MySQL?

此外,从EXPLAIN doc开始,它指出Using index表示

  

仅使用索引树中的信息从表中检索列信息,而无需执行额外的搜索来读取实际行

与您正在进行SELECT *的事实不符,除非您的索引覆盖整个表格。

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

答案 2 :(得分:0)

使用连接,您现在将行限制为“some_interesting_property”,并且您的huge_table中的ID可能不再是连续的...尝试在another_table(some_interesting_property,id)上的索引以及huge_table(another_table_id,id)并查看如果您的EXPLAIN为您提供了更好的提示。