我希望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 ;
答案 0 :(得分:0)
如果您将表类型更改为INNODB,则不会有文件分区
ALTER TABLE mydb
。identity
ENGINE = INNODB;
但我不确定您的查询是否存在问题: http://forums.mysql.com/read.php?24,10738,10785#msg-10785
在操作之前和之后使用EXPLAIN运行原始查询。
答案 1 :(得分:0)
我到目前为止的解决方案是不使用ORDER BY
子句,并在查询中添加FORCE INDEX (identity_modified)
。理论上,这应该确保按照它们存储在索引中的顺序返回行。
这可能不是最佳实践方式,但它似乎是唯一可行的方式。