Новости
Документация
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: Наталья - 27/11/2004 - 20:42:28
Subject:Оптимизация запроса, не использующего ключ
-----------------
с between получается, во-первых, медленнее, во-вторых, вообще ни при каких обстоятельствах не используются ключи

CREATE TABLE `iptocountry` (
`ip_from` int(10) unsigned NOT NULL default '0',
`ip_to` int(10) unsigned NOT NULL default '0',
`country_code2` char(2) default NULL,
`country_code3` char(3) default NULL,
`country_name` varchar(50) default NULL,
UNIQUE KEY `test` (`ip_from`,`ip_to`),
UNIQUE KEY `ip_from` (`ip_from`),
UNIQUE KEY `ip_to` (`ip_to`)
)
# Дамп данных таблицы `iptocountry`
#

INSERT INTO `iptocountry` VALUES (33996344, 33996351, 'GB', 'GBR', 'UNITED KINGDOM');
INSERT INTO `iptocountry` VALUES (50331648, 69956103, 'US', 'USA', 'UNITED STATES');
INSERT INTO `iptocountry` VALUES (69956104, 69956111, 'BM', 'BMU', 'BERMUDA');
INSERT INTO `iptocountry` VALUES (69956112, 83886079, 'US', 'USA', 'UNITED STATES');
INSERT INTO `iptocountry` VALUES (94585424, 94585439, 'SE', 'SWE', 'SWEDEN');
INSERT INTO `iptocountry` VALUES (100663296, 121195295, 'US', 'USA', 'UNITED STATES');
INSERT INTO `iptocountry` VALUES (121195296, 121195327, 'IT', 'ITA', 'ITALY');
INSERT INTO `iptocountry` VALUES (121195328, 152305663, 'US', 'USA', 'UNITED STATES');
INSERT INTO `iptocountry` VALUES (152305664, 152338431, 'GB', 'GBR', 'UNITED KINGDOM');
INSERT INTO `iptocountry` VALUES (152338432, 167772159, 'US', 'USA', 'UNITED STATES');

это просто первая десятка записей, 53 тыс. я, естественно, кидать не буду :)

первая таблица фактически здесь ни при чем, т.к. значение IP, взятое из нее, в PHP подставляется в mysql-запрос.

За желание помочь - огромная благодарность!


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

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

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



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