| Добрый день!
Вопрос, можно ли данные действия выполнить посредством хранимой процедуры.
1. Делаем запрос на выборку количества событий от хоста за промежуток времени:
select
count(*) as cnt,
res.id_host,
res.name,
res.description
from
(
SELECT
hosts.id_host as id_host,
hosts.name as name,
hosts.description as description,
messages.id_message as id_message
FROM
`hosts` JOIN
`messages`
ON
messages.id_host = hosts.id_host
WHERE
syslog_date > SUBTIME( NOW() , '01:00:00' )
union
SELECT
hosts.id_host,
hosts.name,
hosts.description,
bad_messages.id_bad_message
FROM
`hosts` JOIN
`bad_messages`
ON
bad_messages.id_host = hosts.id_host
WHERE
time > SUBTIME( NOW() , '01:00:00' )
) as res
group by
res.id_host
order by
cnt desc";
|
2. Для каждой записи из результата первого запроса делим сообщения по важности (0-7) и считаем количество в каждой группе:
SELECT
base_severity,
id_host,
count(*) AS cnt
FROM
(
SELECT
id_host,
id_mnemonic
FROM
messages
WHERE
syslog_date>SUBTIME(now(),'01:00:00')
)AS res
JOIN
mnemonics
USING (id_mnemonic)
WHERE
id_host=$arr[id_host]
GROUP BY
base_severity
|
В данном случае $arr[id_host] берется из результата первого запроса
3. Фактически повторить процедуру (2) для другой таблицы:
SELECT
count(*) AS cnt
FROM
bad_messages
WHERE
id_host=$arr[id_host]
AND
time>SUBTIME(now(),'01:00:00')
|
Можно ли эти действия выполнить одной хранимой процедурой и получить на выходе примерно следующую таблицу:
id_host|всего сообщений|количество с важностью 0|с важностью 1| ...|с важностью 7| нераспознанных
На данный момент все выполняется из PHP-кода, но для выборки по 700 хостам необходимо 700*2+1=1400 запросов, что уже тяжеловато, особенно если учесть, что для пользователя эта таблица является наиболее важной и обновляется 1 раз в минуту.
Или, может быть, кто-нибудь сможет предложить решение по оптимизации приведенных запросов? Буду очень благодарен
В запросах участвуют таблицы:
messages ( до 5 млн записей)
CREATE TABLE `messages`
(
`id_message` int(11) NOT NULL auto_increment,
`syslog_date` datetime NOT NULL,
`id_host` int(11) NOT NULL,
`id_sub_facility` text,
`id_mnemonic` int(11) NOT NULL,
`message` text NOT NULL,
`message_full` text NOT NULL,
`id_pp_card` int(11) default NULL,
`pp_severity` int(11) default NULL,
`pp_slot` text,
`comment` text NOT NULL,
PRIMARY KEY (`id_message`),
KEY `id_host` (`id_host`),
KEY `id_pp_card` (`id_pp_card`),
KEY `id_mnemonic` (`id_mnemonic`),
KEY `time` (`syslog_date`)
)
|
hosts (1000 записей)
CREATE TABLE `hosts`
(
`id_host` int(11) NOT NULL auto_increment,
`ip_address` varchar(17) NOT NULL,
`id_zone` int(10) unsigned NOT NULL,
`name` text,
`description` text,
`severity` enum('0','1','2','3','4','5','6','7') NOT NULL default '0',
`role` varchar(10) default NULL,
PRIMARY KEY (`id_host`)
)
|
bad_messages (500 тыс. записей)
CREATE TABLE `bad_messages`
(
`id_bad_message` int(11) NOT NULL auto_increment,
`time` datetime default NULL,
`message` text NOT NULL,
`id_host` int(11) NOT NULL,
`severity` enum('0','1','2','3','4','5','6','7') NOT NULL,
PRIMARY KEY (`id_bad_message`),
KEY `id_host` (`id_host`)
)
|
mnemonics (25000 записей)
CREATE TABLE `mnemonics`
(
`id_mnemonic` int(11) NOT NULL auto_increment,
`id_facility` int(11) NOT NULL,
`mnemonic_name` varchar(255) NOT NULL,
`description` text NOT NULL,
`recommended_action` text,
`comment` tinytext,
`base_severity` enum('0','1','2','3','4','5','6','7') NOT NULL,
`severity` enum('0','1','2','3','4','5','6','7') NOT NULL default '0',
PRIMARY KEY (`id_mnemonic`),
KEY `id_facility` (`id_facility`),
KEY `base_severity` (`base_severity`)
)
|
| |