MySQL ORDER BY范围优化

时间:2009-11-11 05:34:47

标签: mysql optimization range sql-order-by

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

SELECT
  identity_ID
FROM
  identity
WHERE
  identity_modified > 1257140905
ORDER BY
  identity_modified

但是,这是使用filesort进行排序(不合需要的)。

现在,如果我在这里省略了ORDER BY子句,那么行的排序只是因为使用索引来满足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 个答案:

答案 0 :(得分:0)

如果您将表类型更改为INNODB,则不会有文件分区

ALTER TABLE mydbidentity ENGINE = 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

答案 1 :(得分:0)

我到目前为止的解决方案是不使用ORDER BY子句,并在查询中添加FORCE INDEX (identity_modified)。理论上,这应该确保按照它们存储在索引中的顺序返回行。

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