我有一个2,000,000多条记录的数据库。我需要能够快速排序表格中的任何一个字段。
我累了添加一个索引,但它似乎没有提高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秒快速,其他字段具有相同的性能会很不错。磁盘空间无关紧要。
答案 0 :(得分:1)
where
子句),我认为索引不重要1024
的字段不是小表,因此其中一些将归结为硬件这篇文章是前一段时间写的,所以我不确定它是否仍然适用,但是当它出来时它是有用的。它讨论了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
答案 1 :(得分:0)
我认为您必须为这些字段创建索引,这会缩短您的查询时间。
答案 2 :(得分:0)
尝试将引擎从MYISAM更改为INNODB。
答案 3 :(得分:0)
你可以逃脱也许排序前10个字符?我没有在MySQL中测试过这个,但是如果你创建了一个fld1_short
字段,它是varchar(10)并用fld1
的前10个字符填充它,和创建它的索引,可能会提供更好的表现。
您可能希望了解有关ORDER BY
优化的MySQL doco - 考虑到数据量,您可能会遇到sort_buffer_size
和/或read_rnd_buffer_size
设置你正在与之合作。
答案 4 :(得分:0)
您可以按正确的顺序创建一个索引,其中包含您选择的所有字段。所以对于您的查询:
SELECT id, fld1, fld2 FROM tblM ORDER BY fld2 ASC LIMIT 30
您可以创建此索引:
create index ix_tblM_fld2 on tblM (fld2, fld1, id)
一句建议是:
按主键排序只是快速的 需要0.0017秒,这将是很好的 其他领域也一样 性能。磁盘空间没有 物质
为了使数据库能够处理您的数据,必须将其加载到内存中。加载到内存中是一个缓慢的操作,RAM通常不是无限制的。创建太多索引会给服务器带来很大负担。