mysql Проблема производительности при запросе с группировкой по - PullRequest
0 голосов
/ 01 февраля 2011

У меня проблема с производительностью.У меня есть таблица под названием Alarmes с 20 столбцами.В этой таблице меня интересуют только 2 столбца (ALM_TAGNAME и ALM_LOGNODENAME).Таблица создается и обновляется автоматически из другой программы, я только хочу сделать статистику.Ну, я добавил ключ к двум столбцам ALM_TAGNAME, а также к ALM_LOGNODENAME, но даже с этими ключами выбор использует более 40 секунд для выполнения.Я только что уменьшил количество строк, но это все еще более 1 миллиона строк.

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

CREATE TABLE Alarmes (
ALM_NATIVETIMEIN datetime NOT NULL, ALM_NATIVETIMELAST datetime по умолчанию NULL, ALM_LOGNODENAME varchar (50) набор символов utf8 по умолчанию NULL,
ALM_PHYSLNODE набор символов varchar (50) utf8 по умолчанию NULL, ALM_TAGNAME набор символов varchar (50) utf8 по умолчанию NULL, ALM_TAGDESC набор символов varchar (50) utf8 по умолчанию NULL,
ALM_VALUE varchar (50)набор символов utf8 по умолчанию NULL, ALM_UNIT varchar (50) набор символов utf8 по умолчанию NULL, ALM_MSGTYPE varchar (50) набор символов utf8 по умолчанию NULL,
ALM_DESCR varchar (255) набор символов utf8 по умолчанию NULL, ALM_ALMSTATUS varchar (50) набор символов utf8 по умолчанию NULL, 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 по умолчанию NULL, ALM_OPFULLNAME varchar (50) набор символов utf8 по умолчанию NULL,
ALM_OPNODE varchar (50) набор символов utf8 по умолчанию NULL, ALM_PERFNAME varchar(50) набор символов utf8 по умолчанию NULL, 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) по умолчанию utf8NULL, ALM_TIMEIN varchar (50) набор символов utf8 по умолчанию NULL, ALM_DATELAST varchar (50) набор символов utf8 default 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 |
+----+-------------+---------+------+--------------------+--------------------+---------+-------+-------+----------------------------------------------+

Ответы [ 2 ]

1 голос
/ 01 февраля 2011

Когда вы говорите: «Ну, я добавил ключ к двум столбцам ALM_TAGNAME, а также к ALM_LOGNODENAME», добавляете ли вы INDEX для ALM_TAGNAME + ALM_LOGNODENAME или два индекса?

Если вы добавите ALM_TAGNAME + ALM_LOGNODENAME, попробуйте добавить только один index в ALM_TAGNAME.

0 голосов
/ 02 февраля 2011

Как часто данные меняются там, где вам нужны COUNT (*) s ..., рассматривали ли вы ночные (или даже ежечасные) предварительно агрегированные таблицы для получения вашего запроса / подсчета из таблицы THAT. Затем вашзапрос к таблице TH для вашего имени тега / имени узла журнала будет отдельной записью и завершен ..

...