mysql在一个大表上慢选择顺序

dcg*_*dcg 3 mysql performance select sql-order-by

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

  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$$
Run Code Online (Sandbox Code Playgroud)

没有索引.使用随机数据随机插入数据,并且工作正常.然后,该表脱机(对其没有读/写操作).此时的表大小约为180M记录.我在ID_1,ID_2,DELTA,ACTIVE字段(全部4,升序)上添加索引.它工作得相当快(3-4分钟).

现在,我试图通过ID_1,ID_2,DELTA,ACTIVE(相同的字段和索引中的相同顺序)按升序获取表中的所有数据,但是选择在'SORTING RESULT'中保持多年(在SHOW中) PROCESSLIST)直到返回第一行.我试图提示/强制SELECT语句使用索引(即FORCE INDEX/USE INDEX),但没有任何区别.有关如何提高此类查询的响应速度的任何提示:

SELECT `ID_1`, `ID_2`, `DELTA`, `ACTIVE` FROM `log` ORDER BY `ID_1`, `ID_2`, `DELTA`, `ACTIVE` ASC;
Run Code Online (Sandbox Code Playgroud)

这里也提出了一个类似的问题:在大表中慢速排序 - 但没有答案.认为发布一个喜欢它的人是一个好主意,也许有人现在知道答案.

谢谢!

Joc*_*lyn 7

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

在你的情况下,它将是:

ALTER TABLE `log` ADD INDEX mySortIndex(`ID_1`, `ID_2`, `DELTA`, `ACTIVE`);
Run Code Online (Sandbox Code Playgroud)

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

EXPLAIN SELECT `ID_1`, `ID_2`, `DELTA`, `ACTIVE` FROM `log` ORDER BY `ID_1`, `ID_2`, `DELTA`, `ACTIVE` ASC;
Run Code Online (Sandbox Code Playgroud)

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

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

SELECT `ID_1`, `ID_2`, `DELTA`, `ACTIVE`
FROM `log` ORDER BY `ID_1`, `ID_2`, `DELTA`, `ACTIVE` ASC
LIMIT 100;
Run Code Online (Sandbox Code Playgroud)