事实:
- 专用服务器,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 秒)
知道如何加速那件事吗?