Новости
Документация
Download
Webboard
Поиск
FAQ/ЧаВо
Обратная связь




MySQL.RU - Webboard



Вернуться
Оптимизация запросов (Василий) 28/05/2012 - 13:08:47
      Re: Оптимизация запросов (Василий) 28/05/2012 - 15:23:40
      Re: Оптимизация запросов (Akina) 28/05/2012 - 21:29:36

> Original message text:
> From: Василий - 28/05/2012 - 13:08:47
> Subject:Оптимизация запросов
> -----------------
> Добрый день. Есть таблица:
>
> CREATE TABLE `project_data` (
> `id` int(11) unsigned NOT NULL AUTO_INCREMENT
> `state_yandex` TINYINT(1) unsigned NOT NULL DEFAULT '0',
> `state_google` TINYINT(1) unsigned NOT NULL DEFAULT '0',
> `keyword_id` int(11) unsigned NOT NULL,
> `date_create` datetime NOT NULL,
> PRIMARY KEY (`id`),
> KEY `keyword_id` (`keyword_id`),
> KEY `keyword_date_create` (`keyword_id`,`date_create`),
> KEY `state_yandex` (`state_yandex`),
> KEY `state_google` (`state_google`)
> ) ENGINE=MyISAM AUTO_INCREMENT=2128 DEFAULT CHARSET=latin1
>
> В которой около 2000 записей. Есть два запроса, которые выполняются около 10 секунд каждый:
>
> а) Получить все последние записи с группировкой по keyword_id
>
> Запрос:
>
> SELECT id,keyword_id,state_yandex,state_google FROM `project_data` WHERE (`keyword_id`,`date_create`) IN (SELECT keyword_id, MAX(date_create) FROM `project_data` GROUP BY keyword_id)
>
> EXPLAIN:
>
> id select_type table type possible_keys key key_len ref rows Extra
> 1 PRIMARY project_data ALL NULL NULL NULL NULL 2015 Using where
> 2 DEPENDENT SUBQUERY project_data index NULL keyword_date_create 12 NULL 1 Using index
>
> б) Получить все последние записи с группировкой по keyword_id, где state_yandex = 1 или state_google = 1.
>
> Запрос:
>
> SELECT keyword_id FROM project_data WHERE (`keyword_id`,`date_create`) IN (SELECT keyword_id,MAX(date_create) FROM project_data GROUP BY keyword_id) AND (state_yandex = 1 OR state_google = 1)
>
> EXPLAIN:
>
> id select_type table type possible_keys key key_len ref rows Extra
> 1 PRIMARY project_data index_merge state_yandex,state_google state_yandex,state_google 1,1 NULL 1063 Using union(state_yandex,state_google); Using where
> 2 DEPENDENT SUBQUERY project_data index NULL keyword_date_create 12 NULL 1 Using index
>
> Вопрос: как можно эти два запроса оптимизировать, чтобы они выполнялись быстрее?
>


From: Akina - 28/05/2012 - 21:29:36
Subject:Оптимизация запросов
-----------------
Вариант первый (полумера) - заменить IN на EXISTS.
Вариант второй - сделать как положено, вот ссылки на два варианта реализации:
MySQL-specific: http://www.sql.ru/forum/actualthread.aspx?tid=687908
Универсально (идея): http://forum.vingrad.ru/index.php?showtopic=238891&view=findpost&p=1717573


[Это сообщение - спам!]

Последние сообщения из форума

Уважаемые посетители форума MySQL.RU!
Убедительная просьба, прежде чем задавать свой вопрос в этом форуме, обратите внимание на разделы:
- ответы на наиболее часто задаваемые вопросы - FAQ
- раздел документация
- раздел поиск по сообщениям форума и документации
Также, старайтесь наиболее подробно указывать свою ситуацию (версию операционной системы, версию MySQL, версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
 Имя:
 E-mail:
 Тема:
 Текст:
Код подтверждения отправки: Code
41352



РЕКЛАМА НА САЙТЕ
  Создание сайтов | |