代码之家  ›  专栏  ›  技术社区  ›  Julien Palard

Mysql:获取最后记录的最佳实践

  •  4
  • Julien Palard  · 技术社区  · 15 年前

    我有一个关于mysql的问题。。。

    此时你想回答:

    设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
    

    如果没有连接,mysql会从末尾读取索引并运行10个条目,执行时间可以忽略不计 使用join,执行时间取决于表的大小,在很多情况下,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 join类型的表。)“

    我的问题是:使用ORDER BY。。。限制10个才能得到最后一个项目?你真的这样做时,挑选最后10张卡片在一个升序卡片组?就我个人而言,我只是从底部选了10个。。。

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

    3 回复  |  直到 15 年前
        1
  •  0
  •   shikhar    15 年前

    问得好,我想你应该按列排序,也就是说,id a DESC index。
    这应该能解决问题。
    http://dev.mysql.com/doc/refman/5.0/en/create-index.html

        2
  •  0
  •   Lynette Duffy    15 年前

        3
  •  0
  •   Riedsio    15 年前

    我很难重现你的情况。我是否使用 ASC DESC 用我的 huge_table another_table 模型,我的 EXPLAIN s和执行时间都显示大约 N 行读取和逻辑连接。你在使用哪个版本的MySQL?

    解释 doc ,声明 Using index 表示

    从表中检索到的附加信息不需要从表中读取实际的行信息

    这与你正在做的 SELECT * ,除非您有一个覆盖整个表的索引。

    也许您应该显示您的模式,包括索引,以及 解释