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




MySQL.RU - Webboard



Вернуться
Индексы и BETWEEN - непонятный баг (G_M_S) 03/04/2012 - 16:30:14
      Re: Индексы и BETWEEN - непонятный баг (Akina) 04/04/2012 - 10:50:53
      Re: Да, кстати... (Akina) 04/04/2012 - 11:06:52

> Original message text:
> From: G_M_S - 03/04/2012 - 16:30:14
> Subject:Индексы и BETWEEN - непонятный баг
> -----------------
> Доброго времени суток!
>
> Возникла проблема такого рода: есть табличка для хранения геотегов к файлам (для отображения на карте гуглмапс). В ней имеются 2 поля: lat и lng типа DOUBLE, содержащие широту и долготу в градусах (для тех, кто не сталкивался - циферки от -180 до 180 с точностью до 3-х знаков). Заполняю ее тестовым набором записей чуть более полумиллиона штук (527 тыс, если быть совсем точным). Движок - InnoDB. Делаю выборку запросом:
>
> select * from files_geotags where (lat between -40 and -38) and (lon between 28 and 30);
>
> Получаю время выполнения ~5 секунд. Вешаю составной индекс на оба поля, повторяю выборку - получаю время выполнения ~26 секунд о_0 Это что за фокусы такие? Я раньше с орацлом и интербейзом работал и НИ РАЗУ не видел, что б индекс на числовом поле УВЕЛИЧИВАЛ время выборки! Проверил эксплайном - индекс используется! Без индекса перебирает все 527 тыс записей, с индексом (range) перебирает всего 29 тыс. В чем может быть проблема?
>
> Пробовал создать два дополнительных поля типа INT и пихнуть в них координаты, умноженные на 1000 (что б не терять дробную часть - зачастую координаты углов карты отличаются менее чем на 1 градус) - результат вышел даже хуже: без индекса запрос выполняется 7 секунд, с индексом - около 30.
>
> Подскажите пожалуйста, как побороть этот баг? Почему запрос С ИНДЕКСОМ выполняется ДОЛЬШЕ, чем без него? В чем проблема?
>


From: Akina - 04/04/2012 - 10:50:53
Subject:Индексы и BETWEEN - непонятный баг
-----------------
1) Это не баг. Индекс вовсе не обязан уменьшать время выполнения, а если Вы чего-то не видели, то сие вовсе не значит. что этого не бывает. Или Вы правда думаете, что введение форсажа НЕиспользования индекса - это никому не нужная дурь, реализованнная для чисто поржать?

2) Составной индекс НЕ МОЖЕТ быть использован на запросах такого рода - это аксиома. Читайте иногда маны, что ли... именно поэтому его использование и тормозит процесс. Гораздо более эффективно будет использовать чистый индекс по одному полю и фуллскан по другому, развернув соответствующий between в два условия больше и меньше. А вообще для эффективных выборок типа between существуют специальные приёмы - гугель в помощь.


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

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

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



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