【问题标题】:mysql Performance problem on query with group bymysql 使用 group by 查询的性能问题
【发布时间】:2011-06-19 07:31:01
【问题描述】:

我遇到了性能问题。我有一个名为 Alarmes 的表,有 20 列。在此表中,我只对 2 列(ALM_TAGNAME 和 ALM_LOGNODENAME)感兴趣。该表是从另一个程序自动创建和更新的,我只想做一个统计。 好吧,我在 ALM_TAGNAME 和 ALM_LOGNODENAME 两列上添加了一个键,但即使使用此键,选择也会使用超过 40 秒的时间来执行。我只是减少了行数,但仍然超过 100 万行。

SELECT ALM_TAGNAME as 'tag', count(*) as  'cnt'    FROM Alarmes WHERE ALM_LOGNODENAME='plantid' GROUP BY ALM_TAGNAME; 

创建表Alarmes (
ALM_NATIVETIMEIN datetime NOT NULL, ALM_NATIVETIMELAST 日期时间默认 空,ALM_LOGNODENAME varchar(50) 字符集 utf8 默认 NULL,
ALM_PHYSLNODE varchar(50) 字符 设置 utf8 默认为 NULL,ALM_TAGNAME varchar(50) 字符集 utf8 默认 空,ALM_TAGDESC varchar(50) 字符集 utf8 默认 NULL,
ALM_VALUE varchar(50) 字符集 utf8 默认 NULL,ALM_UNIT varchar(50) 字符集 utf8 默认 空,ALM_MSGTYPE varchar(50) 字符集 utf8 默认 NULL,
ALM_DESCR varchar(255) 字符集 utf8 默认 NULL,ALM_ALMSTATUS varchar(50) 字符集 utf8 默认 空,ALM_ALMPRIORITY varchar(50) 字符集 utf8 默认 NULL,
ALM_ALMAREA varchar(50) 字符 设置 utf8 默认 NULL,
ALM_ALMEXTFLD1 varchar(50) 字符 设置 utf8 默认 NULL,
ALM_ALMEXTFLD2 varchar(50) 字符 设置 utf8 默认为 NULL,ALM_OPNAME varchar(50) 字符集 utf8 默认 空,ALM_OPFULLNAME varchar(50) 字符集 utf8 默认 NULL,
ALM_OPNODE varchar(50) 字符集 utf8 默认 NULL,ALM_PERFNAME varchar(50) 字符集 utf8 默认 空,ALM_PERFFULLNAME varchar(50) 字符集 utf8 默认 NULL,
ALM_PERFBYCOMMENT varchar(50) 字符集 utf8 默认 NULL,
ALM_VERNAME varchar(50) 字符 设置 utf8 默认 NULL,
ALM_VERFULLNAME varchar(50) 字符集 utf8 默认 NULL,
ALM_VERBYCOMMENT varchar(50) 字符集 utf8 默认 NULL,
ALM_DATEIN varchar(50) 字符集 utf8 默认 NULL,ALM_TIMEIN varchar(50) 字符集 utf8 默认 空,ALM_DATELAST varchar(50) 字符集 utf8 默认 NULL,
ALM_TIMELAST varchar(50) 字符 设置 utf8 默认 NULL, KEY Alarmes_tagname (ALM_TAGNAME),
Alarmes_lognodname (ALM_LOGNODENAME))

EXPLAIN SELECT ALM_TAGNAME as 'tag', count(ALM_TAGNAME) as  'cnt'    FROM monitor.Alarmes   WHERE ALM_LOGNODENAME='bogota'   GROUP BY ALM_TAGNAME;    +----+-------------+---------+------+--------------------+--------------------+---------+-------+-------+----------------------------------------------+
| id | select_type | table   | type | possible_keys      | key                | key_len | ref   | rows  | Extra                                        |
+----+-------------+---------+------+--------------------+--------------------+---------+-------+-------+----------------------------------------------+
|  1 | SIMPLE      | Alarmes | ref  | Alarmes_lognodname | Alarmes_lognodname | 153     | const | 86143 | Using where; Using temporary; Using filesort |
+----+-------------+---------+------+--------------------+--------------------+---------+-------+-------+----------------------------------------------+

 DESCRIBE SELECT ALM_TAGNAME as 'tag', count(ALM_TAGNAME) as  'cnt'    FROM monitor.Alarmes   WHERE ALM_LOGNODENAME='bogota'   GROUP BY ALM_TAGNAME;
+----+-------------+---------+------+--------------------+--------------------+---------+-------+-------+----------------------------------------------+
| id | select_type | table   | type | possible_keys      | key                | key_len | ref   | rows  | Extra                                        |
+----+-------------+---------+------+--------------------+--------------------+---------+-------+-------+----------------------------------------------+
|  1 | SIMPLE      | Alarmes | ref  | Alarmes_lognodname | Alarmes_lognodname | 153     | const | 86154 | Using where; Using temporary; Using filesort |
+----+-------------+---------+------+--------------------+--------------------+---------+-------+-------+----------------------------------------------+

【问题讨论】:

  • 也许尝试重建索引?另外,如果是用于统计数据收集,我会将结果缓存在汇总表中。

标签: mysql query-optimization


【解决方案1】:

当您说“嗯,我在 ALM_TAGNAME 和 ALM_LOGNODENAME 两列上添加了一个键”时,您是在 ALM_TAGNAME+ALM_LOGNODENAME 上添加 INDEX 还是两个索引?

如果您添加 ALM_TAGNAME+ALM_LOGNODENAME,请尝试在 ALM_TAGNAME 上仅添加一个 索引

【讨论】:

    【解决方案2】:

    数据在您需要 COUNT(*)s 的位置更改的频率如何...,您是否考虑过每晚(甚至每小时)的预聚合表来从该表中获取查询/计数。然后,您的在标签名称/日志节点名称上查询该表将是一条记录并完成..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-18
      • 1970-01-01
      • 2017-02-11
      相关资源
      最近更新 更多