MySQL按范围优化订购

MySQL按范围优化订购,mysql,optimization,range,sql-order-by,Mysql,Optimization,Range,Sql Order By,我希望MySQL使用索引对这些行进行排序 SELECT identity_ID FROM identity WHERE identity_modified > 1257140905 ORDER BY identity_modified 但是,这是使用文件排序进行排序(不需要) 现在,如果我在这里不使用ORDERBY子句,那么行的排序仅仅是使用索引满足WHERE子句的结果 因此,我可以通过省略WHERE子句来获得我想要的行为,但是我依赖于MySQL的行为来保持行的一致性,并

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

SELECT
  identity_ID
FROM
  identity
WHERE
  identity_modified > 1257140905
ORDER BY
  identity_modified
但是,这是使用文件排序进行排序(不需要)

现在,如果我在这里不使用ORDERBY子句,那么行的排序仅仅是使用索引满足WHERE子句的结果

因此,我可以通过省略WHERE子句来获得我想要的行为,但是我依赖于MySQL的行为来保持行的一致性,并且如果MySQL改变其内部行为,将来可能会被刺痛

我该怎么办?有没有办法告诉MySQL,因为索引是按顺序(b-tree)存储的,所以它不需要文件排序

该表如下所示(简化):


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

更改表格
mydb
identity
ENGINE=INNODB

但我不确定您的查询是否有问题:

在操作前后使用EXPLAIN运行原始查询


到目前为止,我的解决方案是取消
orderby
子句,并在查询中添加一个
强制索引(identity\u modified)
。从理论上讲,这应该确保按存储在索引中的顺序返回行


这可能不是一种最佳实践方式,但似乎是唯一一种符合我要求的方式。

让我澄清一下我的理解,您想对修改的标识进行排序,而不是对其他字段进行排序?或者我遗漏了要点,重点是,我想检索自某个日期以来修改过的所有记录,按上次修改的日期排序。我不希望MySQL必须为此进行文件排序;它可能不得不对表中的大多数内容进行排序。由于MySQL按顺序存储索引行,因此不需要文件排序。您可以按顺序和不按顺序发布此查询的解释吗。对我来说,它要么进行完全扫描和排序,要么使用索引而不进行排序(取决于提取的记录数量)。是的,它在该列上有一个索引。它正在使用WHERE子句的索引,但没有使用索引进行排序。您能创建一个脚本以便我们可以重新创建表吗?查询是否在完整查询之上或缺少某些内容?在问题中添加了表def。是的,上面的查询是完整的-我只需要按修改日期的顺序显示标识ID值,其中修改日期大于某个值。
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 ;