事实:
- 专用服务器,4 核,16GB
- MySQL 5.5.29-0ubuntu0.12.10.1-log - (Ubuntu)
- 一张表,190 万行并且还在增长
我需要所有已排序的行用于导出或 5er 块。查询需要 25 秒,复制到 Tmp 表 23.3 秒
我尝试了 InnoDB 和 MyISAM,更改索引顺序,使用 MD5 哈希some_text作为 GROUP BY,将表分区day。
day是一个 Unix-Timestamp 并且一直存在。
lang some_bool some_filter ano_filter rel_id可以在 where 子句中,但不需要。
这是 MyISAM 示例:
桌子
mysql> 显示创建表数据 \G;
****************************** 1. 行 ************************ *******
表:数据
创建表: CREATE TABLE `data` (
`data_id` bigint(20) NOT NULL AUTO_INCREMENT,
`rel_id` int(11) 非空,
`some_text` varchar(255) 默认为空,
`lang` varchar(3) 默认为空,
`some_bool` tinyint(1) 默认为 NULL,
`some_filter` varchar(40) 默认为空,
`ano_filter` varchar(10) 默认为空,
`day` int(11) 默认为空,
主键(`data_id`),
KEY `cnt_idx` (`some_filter`,`ano_filter`,`rel_id`,`lang`,`some_bool`,`some_text`,`day`)
) 引擎=MyISAM AUTO_INCREMENT=1900099 默认字符集=utf8
一组中的 1 行(0.00 秒)
查询
mysql> EXPLAIN SELECT `some_text` , COUNT(*) AS `num` FROM `data`
WHERE `lang` = 'en' AND `day` BETWEEN '1364342400' AND
'1366934399' GROUP BY `some_text` ORDER BY `num` DESC \G;
****************************** 1. 行 ************************ *******
编号:1
选择类型:简单
表:数据
类型:索引
可能的键:NULL
键:cnt_idx
关键长度:947
参考:空
行数:1900098
额外:使用where;使用索引;使用临时的;使用文件排序
一组中的 1 行(0.00 秒)
mysql> SELECT `some_text` , COUNT(*) AS `num` FROM `data` WHERE `lang` = 'en' AND `day` BETWEEN '1364342400' AND '1366934399' GROUP BY `some_text` ORDER BY `num` DESC LIMIT 5 \G; ... *************************** 5. 行 ********************* ******* 5 行一组(24.26 秒)
知道如何加速那件事吗?