如何快速对MySQL中的记录进行排序?

时间:2011-06-26 06:34:20

标签: mysql sql indexing sql-order-by

我有一个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秒快速,其他字段具有相同的性能会很不错。磁盘空间无关紧要。

5 个答案:

答案 0 :(得分:1)

  1. 如果您没有应用过滤器(where子句),我认为索引不重要
  2. 2,000,000行,大小为1024的字段不是小表,因此其中一些将归结为硬件
  3. 如果再次运行它的速度是多少?也许缓存会改善其性能。
  4. 您可以使用InnoDB代替MyISAM吗?
  5. 修改


    1. 这篇文章是前一段时间写的,所以我不确定它是否仍然适用,但是当它出来时它是有用的。它讨论了InnoDB和MyISAM之间关于聚簇索引的区别。 http://www.xaprb.com/blog/2006/07/04/how-to-exploit-mysql-index-optimizations/

    2. 尝试使用USE INDEXFORCE 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)

你试图对1024长度的varchar进行排序吗?这是很多潜在的工作......

你可以逃脱也许排序前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通常不是无限制的。创建太多索引会给服务器带来很大负担。