代码之家  ›  专栏  ›  技术社区  ›  thomasrutter

基于范围优化的MySQL订单

  •  1
  • thomasrutter  · 技术社区  · 15 年前

    我希望MySQL使用索引对这些行进行排序。

    SELECT
      identity_ID
    FROM
      identity
    WHERE
      identity_modified > 1257140905
    ORDER BY
      identity_modified
    

    但是,这是使用文件排序(不需要)。

    现在,如果我在这里不使用ORDERBY子句,行将被排序出来。 仅作为使用索引满足WHERE子句的结果 .

    所以,我可以通过省略WHERE子句来获得我想要的行为,但是我依赖于MySQL的行为来保持行的一致性,以便有序到达,并且如果MySQL改变其内部行为,将来可能会受到影响。

    我该怎么办?有什么方法可以告诉MySQL,因为索引是按顺序存储的(B-Tree),所以它不需要进行文件排序?

    表如下(简化):

    CREATE TABLE IF NOT EXISTS `identity` (
      `identity_ID`       int(11) NOT NULL auto_increment,
      `identity_modified` int(11) NOT NULL,
      PRIMARY KEY         (`identity_ID`),
      KEY                 `identity_modified` (`identity_modified`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;
    
    2 回复  |  直到 15 年前
        1
  •  0
  •   thomasrutter    15 年前

    我目前的解决办法是 ORDER BY 子句,并添加 FORCE INDEX (identity_modified) 查询。理论上,这应该确保按存储在索引中的顺序返回行。

    可能不是 最佳实践 但这似乎是唯一可行的方法。

        2
  •  0
  •   orjan    15 年前

    如果将表类型更改为innodb,则不会有文件排序

    变更表 mydb . identity 发动机=InnoDB;

    但我不确定你的问题是什么: http://forums.mysql.com/read.php?24,10738,10785#msg-10785

    在操作前后运行带有explain的原始查询。

    http://dev.mysql.com/doc/refman/5.0/en/using-explain.html