|
MySQL.RU - Webboard
Вернуться
Оптимизация запроса, не использующего ключ (Наталья) 27/11/2004 - 18:11:53
Re: Оптимизация запроса, не использующего ключ (Dubrovsky) 27/11/2004 - 20:19:02
Re: Оптимизация запроса, не использующего ключ (Наталья) 27/11/2004 - 20:42:28
Re: Оптимизация запроса, не использующего ключ (Dubrovsky) 28/11/2004 - 02:31:00
Re: Оптимизация запроса, не использующего ключ (Наталья) 28/11/2004 - 16:46:01
Re: Оптимизация запроса, не использующего ключ (Dubrovsky) 28/11/2004 - 21:01:22
Re: Оптимизация запроса, не использующего ключ (Dubrovsky) 28/11/2004 - 21:02:31
Re: во, блин, развезли (Dinky) 29/11/2004 - 20:41:20
Re: во, блин, развезли (Наталья) 05/12/2004 - 09:12:11
Re: Оптимизация запроса, не использующего ключ (Наталья) 05/12/2004 - 09:13:12
Re: во, блин, развезли (Dinky) 07/12/2004 - 01:26:20
Re: во, блин, развезли (Наталья) 09/12/2004 - 09:10:53
Re: во, блин, развезли (Dinky) 10/12/2004 - 20:34:08
Re: Все! дошлО наконец :) (Dinky) 11/12/2004 - 00:07:54
Re: Все! дошлО наконец :) (Наталья) 23/12/2004 - 10:25:56
> Original message text:
> From: Наталья - 27/11/2004 - 18:11:53
> Subject:Оптимизация запроса, не использующего ключ
> -----------------
> Добрый день!
> Проблема следующая: есть две таблицы. В первой хранятся IP-шники (int unsigned not null default '0'), индекс по IP есть. IP отсортированы в порядке возрастания.
> Из второй таблицы в цикле для каждого IP выбирается страна:
>
> select country_code2 from iptocountry where '3282182154'>=ip_from AND '3282182154'<=ip_to
>
> Таких однотипных запросов очень много (несколько тысяч) и делаются они в цикле.
> Во второй таблице поля ip_from и ip_to - граничные значения интервала IP страны, также int unsigned not null default '0'. Есть три индекса: по полю ip_from, по полю ip_to и по обоим этим полям (test). Все индексы UNIQUE (записи действительно уникальны). Строк во второй таблице почти 53 тыс., поэтому брать всю таблицу и разбираться с ней в PHP - нереально.
> Работает все это весьма долго. Оказалась следующая ситуация: время выполнения вышеприведенных запросов колеблется от 0.004 до 0.4 сек (это при том, что еще каждый раз делается mysql_free_result; без него один запрос до 2 сек мог выполняться!). Проверили explain'ом. Логично было бы предположить, что должен использоваться всегда ключ test. Но, оказывается, примерно первая треть запросов (которая занимает не очень много времени) выполняется с ключом test (т.е. по обоим полям), причем чем больше IP, тем больше строк выбирается в индексе. Когда количество строк переваливает за треть, MySQL перестает (как и написано в документации) использовать ключ. Таким образом вторая часть - самая длительная - вообще не использует никакого ключа (даже при явном указании на него use index test), и естественно выборка идет All. Третья часть использует ключ ip_to (время опять снижается).
>
> Возможно, кто-то уже сталкивался с этой ситуацией. Подскажите, каким образом можно либо оптимизировать запрос, либо ускорить выполнение данного куска каким-либо методом.
> Заранее благодарна
>
From: Наталья - 09/12/2004 - 09:10:53
Subject:во, блин, развезли
-----------------
это зависит от IP, по которому идет проверка.. попробуйте подставить разные значения - например,
explain select country_code2 from iptocountry where '1385220156'>=ip_from AND '1385220156'<=ip_to - исп. ключ ip_from_to
explain select country_code2 from iptocountry where '3568365100'>=ip_from AND '3568365100'<=ip_to - исп. ключ ip_to_from
EXPLAIN SELECT country_code2
FROM iptocountry
WHERE '3259236346' >= ip_from AND '3259236346' <= ip_to - не используется НИ ОДИН ключ!
в этом и проблема, что ключи не охватывают всю таблицу
[Это сообщение - спам!]
Последние сообщения из форума
Уважаемые посетители форума MySQL.RU!
Убедительная просьба, прежде чем задавать свой вопрос в этом форуме, обратите внимание на разделы:
- ответы на наиболее часто задаваемые вопросы - FAQ
- раздел документация
- раздел поиск по сообщениям форума и документации
Также, старайтесь наиболее подробно указывать свою ситуацию (версию операционной системы, версию MySQL,
версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
19206
|
|