我有一个包含 2,000,000 多条记录的数据库。我需要能够根据表格中的 30 个字段中的任何一个快速排序。
我厌倦了添加索引,但它似乎并没有提高 order by 子句的速度。
这是我的表结构:
CREATE TABLE `tblM` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`fld1` varchar(1024) NOT NULL,
`fld2` varchar(1024) NOT NULL,
...
PRIMARY KEY (`id`),
KEY `fld1` (`fld1`(1000)),
KEY `fld2` (`fld2`(1000)),
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=21748375 ;
这是我运行的示例查询:
SELECT id, fld1, fld2 FROM tblM ORDER BY fld2 ASC LIMIT 30
然而,这需要大约 15 秒才能执行。有什么方法可以在 < 1 秒内执行这些类型的查询?
按主键排序很快只需要 0.0017 秒,如果其他字段具有相同的性能就好了。磁盘空间无关紧要。
最佳答案
- 如果您不应用过滤器(
where
子句),我认为索引无关紧要 - 字段大小为
1024
的 2,000,000 行不是一个小表,因此其中一些将归结为硬件 - 如果再跑一次,速度是多少?也许缓存会提高它的性能。
- 你能用 InnoDB 代替 MyISAM 吗?
编辑
这篇文章是前段时间写的,所以我不确定它是否仍然适用,但它发表时提供了很多信息。它讨论了 InnoDB 和 MyISAM 之间关于聚簇索引的区别。 http://www.xaprb.com/blog/2006/07/04/how-to-exploit-mysql-index-optimizations/
尝试使用
USE INDEX
或FORCE INDEX
:SELECT id, fld1, fld2 FROM tblM USE INDEX (fld2) ORDER BY fld2 ASC LIMIT 30
或
SELECT id, fld1, fld2 FROM tblM FORCE INDEX (fld2) ORDER BY fld2 ASC LIMIT 30
关于mysql - 如何快速对 MySQL 中的记录进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6482511/