【发布时间】: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_NATIVETIMEINdatetime NOT NULL,ALM_NATIVETIMELAST日期时间默认 空,ALM_LOGNODENAMEvarchar(50) 字符集 utf8 默认 NULL,ALM_PHYSLNODEvarchar(50) 字符 设置 utf8 默认为 NULL,ALM_TAGNAMEvarchar(50) 字符集 utf8 默认 空,ALM_TAGDESCvarchar(50) 字符集 utf8 默认 NULL,ALM_VALUEvarchar(50) 字符集 utf8 默认 NULL,ALM_UNITvarchar(50) 字符集 utf8 默认 空,ALM_MSGTYPEvarchar(50) 字符集 utf8 默认 NULL,ALM_DESCRvarchar(255) 字符集 utf8 默认 NULL,ALM_ALMSTATUSvarchar(50) 字符集 utf8 默认 空,ALM_ALMPRIORITYvarchar(50) 字符集 utf8 默认 NULL,ALM_ALMAREAvarchar(50) 字符 设置 utf8 默认 NULL,ALM_ALMEXTFLD1varchar(50) 字符 设置 utf8 默认 NULL,ALM_ALMEXTFLD2varchar(50) 字符 设置 utf8 默认为 NULL,ALM_OPNAMEvarchar(50) 字符集 utf8 默认 空,ALM_OPFULLNAMEvarchar(50) 字符集 utf8 默认 NULL,ALM_OPNODEvarchar(50) 字符集 utf8 默认 NULL,ALM_PERFNAMEvarchar(50) 字符集 utf8 默认 空,ALM_PERFFULLNAMEvarchar(50) 字符集 utf8 默认 NULL,ALM_PERFBYCOMMENTvarchar(50) 字符集 utf8 默认 NULL,ALM_VERNAMEvarchar(50) 字符 设置 utf8 默认 NULL,ALM_VERFULLNAMEvarchar(50) 字符集 utf8 默认 NULL,ALM_VERBYCOMMENTvarchar(50) 字符集 utf8 默认 NULL,ALM_DATEINvarchar(50) 字符集 utf8 默认 NULL,ALM_TIMEINvarchar(50) 字符集 utf8 默认 空,ALM_DATELASTvarchar(50) 字符集 utf8 默认 NULL,ALM_TIMELASTvarchar(50) 字符 设置 utf8 默认 NULL, KEYAlarmes_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 |
+----+-------------+---------+------+--------------------+--------------------+---------+-------+-------+----------------------------------------------+
【问题讨论】:
-
也许尝试重建索引?另外,如果是用于统计数据收集,我会将结果缓存在汇总表中。