|
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: Василий - 28/05/2012 - 15:23:40
Subject:Оптимизация запросов
-----------------
Проблема решилась изменением запросов на:
SELECT b.id,b.state_yandex,b.state_google,b.keyword_id
FROM ( SELECT keyword_id, MAX(date_create) AS date_create
FROM project_relevant
GROUP BY keyword_id
) AS a
LEFT JOIN project_relevant AS b ON a.keyword_id= b.keyword_id AND a.date_create = b.date_create
SELECT b.keyword_id FROM (
SELECT keyword_id, MAX(date_create) AS date_create
FROM project_data
GROUP BY keyword_id
) AS a
LEFT JOIN project_data AS b
ON a.keyword_id= b.keyword_id AND a.date_create = b.date_create
WHERE b.state_yandex = 1 OR b.state_google = 1
[Это сообщение - спам!]
Последние сообщения из форума
Уважаемые посетители форума MySQL.RU!
Убедительная просьба, прежде чем задавать свой вопрос в этом форуме, обратите внимание на разделы:
- ответы на наиболее часто задаваемые вопросы - FAQ
- раздел документация
- раздел поиск по сообщениям форума и документации
Также, старайтесь наиболее подробно указывать свою ситуацию (версию операционной системы, версию MySQL,
версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
41352
|
|