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

标签 mysql sql indexing sql-order-by

我有一个包含 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 秒,如果其他字段具有相同的性能就好了。磁盘空间无关紧要。

最佳答案

  1. 如果您不应用过滤器(where 子句),我认为索引无关紧要
  2. 字段大小为 1024 的 2,000,000 行不是一个小表,因此其中一些将归结为硬件
  3. 如果再跑一次,速度是多少?也许缓存会提高它的性能。
  4. 你能用 InnoDB 代替 MyISAM 吗?

编辑


  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
    

关于mysql - 如何快速对 MySQL 中的记录进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6482511/

相关文章:

python - Pandas bool 索引 : matching a set

php - 将数据从 PHP 脚本发送到 iOS

MySQL在线测试工具

php - mysql 查询问题,在返回多行时查找单行

php - 在数据库中的同一个表中使用连接

Java JDBC 问题,第 1 行不包含所有列的数据

php - UTF-8贯穿始终

sql - 在Entity Framework 1.0中SaveChanges之后触发存储过程

python - 为什么不是数组[:] copying the array?

c - 如何编写一个程序来打印数组中的素数,该数组的索引也是素数