0

事实:

  • 专用服务器,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 秒)

知道如何加速那件事吗?

4

1 回答 1

0

由于索引中的列顺序,没有使用索引。索引从左到右工作。要使此查询使用索引,您需要一个lang, day.

于 2013-04-26T21:49:37.047 回答