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




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, версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
 Имя:
 E-mail:
 Тема:
 Текст:
Код подтверждения отправки: Code
19206



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