【问题标题】:MySQL SELECT COUNT with GROUP and ORDER performance issueMySQL SELECT COUNT 与 GROUP 和 ORDER 性能问题
【发布时间】:2013-04-21 04:12:04
【问题描述】:

事实:

  • 专用服务器,4 核,16GB
  • MySQL 5.5.29-0ubuntu0.12.10.1-log - (Ubuntu)
  • 一个表,190 万行并且还在增长

我需要所有已排序的行用于导出或 5er 块。使用 Copying To Tmp Table 23.3 s 查询需要 25 秒

我尝试过 InnoDB 和 MyISAM,更改索引顺序,使用 some_text 的 MD5 哈希作为 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 秒)

知道如何加快这件事的速度吗?`

【问题讨论】:

    标签: mysql performance count group-by


    【解决方案1】:

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

    【讨论】:

    • 我添加了索引 KEY lang (lang,day) 但它根本没有使用:|1|SIMPLE|data|ALL|lang|NULL|NULL|NULL |1900098|在哪里使用;使用临时的;使用文件排序|一组 5 行(27.51 秒)
    • 我听不懂那些乱码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多