Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Возможности хранимых процедур по обработке результатов запроса в цикле
 
 автор: Woland   (04.04.2008 в 07:01)   письмо автору
 
 

Добрый день!
Вопрос, можно ли данные действия выполнить посредством хранимой процедуры.
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`)

   
 
 автор: Woland   (05.04.2008 в 07:04)   письмо автору
 
   для: Woland   (04.04.2008 в 07:01)
 

Неужели ни у кого нет мыслей? Может быть, нужно по-другому сформулировать вопрос?

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования