首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mysql在大表上慢选择order by

mysql在大表上慢选择order by
EN

Stack Overflow用户
提问于 2012-11-15 08:31:55
回答 1查看 3.8K关注 0票数 3

我在mysql中存储了一个很大的表(基本上就是一个日志),如下所示:

代码语言:javascript
复制
  CREATE TABLE `log` (
    `ID_1` int(10) unsigned NOT NULL,
    `ID_2` int(10) unsigned NOT NULL,
    `DELTA` tinyint(3) unsigned NOT NULL,
    `ACTIVE` tinyint(1) NOT NULL,
    `DATA` bigint(20) unsigned NOT NULL,
  ) ENGINE=MyISAM DEFAULT CHARSET=utf8$$

没有索引。数据在随机时刻与随机数据一起插入,它工作得很好。然后,该表将离线(没有对其进行读/写操作)。此时的表大小约为180M条记录。我添加了一个索引的ID_1,ID_2,增量,活动字段(所有4,升序)。它的工作速度相当快(3-4分钟)。

现在,我试图通过ID_1、ID_2、DELTA、ACTIVE (与索引相同的字段和顺序)从表中获取所有数据,但select会在“排序结果”(在SHOW PROCESSLIST中)中保留很长时间,直到返回第一行。我试图提示/强制SELECT语句使用索引(即FORCE index / use INDEX),但没有任何区别。关于如何提高这种查询的响应速度的任何提示:

代码语言:javascript
复制
SELECT `ID_1`, `ID_2`, `DELTA`, `ACTIVE` FROM `log` ORDER BY `ID_1`, `ID_2`, `DELTA`, `ACTIVE` ASC;

这里提出了一个类似的问题:Slow ORDER BY in large table --但没有答案。虽然这是一个好主意,张贴喜欢它,也许有人已经知道答案了。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-15 09:32:25

要有效地对数据进行排序,必须使用要在ORDER BY子句中使用的所有列来添加复合索引。索引中列的顺序必须与ORDER BY子句中的列顺序相同。

在您的情况下,它将是:

代码语言:javascript
复制
ALTER TABLE `log` ADD INDEX mySortIndex(`ID_1`, `ID_2`, `DELTA`, `ACTIVE`);

要检查MySQL是如何执行查询的,请使用:

代码语言:javascript
复制
EXPLAIN SELECT `ID_1`, `ID_2`, `DELTA`, `ACTIVE` FROM `log` ORDER BY `ID_1`, `ID_2`, `DELTA`, `ACTIVE` ASC;

输出将告诉您使用了哪些索引。

如果您只需要已知数量的结果行,则可以使用LIMIT阻止MySQL对整个表进行排序:

代码语言:javascript
复制
SELECT `ID_1`, `ID_2`, `DELTA`, `ACTIVE`
FROM `log` ORDER BY `ID_1`, `ID_2`, `DELTA`, `ACTIVE` ASC
LIMIT 100;
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13389817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档