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




MySQL.RU - Webboard



Вернуться
Индексы в BETWEEN при join-е (RXL) 19/03/2003 - 14:55:33
      Re: Индексы в BETWEEN при join-е (Dinky) 19/03/2003 - 18:30:23
      Re: Индексы в BETWEEN при join-е (Валентин) 19/03/2003 - 20:58:15
      Re: Индексы в BETWEEN при join-е (XODOK) 20/03/2003 - 03:52:15
      Re: Индексы в BETWEEN при join-е (RXL) 20/03/2003 - 14:06:45
      Re: Индексы в BETWEEN при join-е (Валентин) 20/03/2003 - 17:01:27
      Re: Индексы в BETWEEN при join-е (Dinky) 20/03/2003 - 19:49:20
      Re: Индексы в BETWEEN при join-е (RXL) 21/03/2003 - 12:56:17

> Original message text:
> From: RXL - 19/03/2003 - 14:55:33
> Subject:Индексы в BETWEEN при join-е
> -----------------
> Мучаюсь вот такой проблемой.
> Есть две таблицы:
> t1 - много строк (сейчас 106т, прирост 1-10т/сутки).
> id int not null unique,
> ...полезная нагрузка...
> t2 - мало строк (16 строк, прирост 8/сутки).
> begin int not null,
> end int NULL,
> ...прочие данные...
>
> В каждой строке таблицы t2 в полях begin и end хранится диапазон для t1.id . Нужно выбрать все строки в t1 соответствующие каждой строке в t2 (для всех строк t2).
>
> SELECT t1.* FROM t1,t2 WHERE t1.id BETWEEN t2.begin AND t2.end AND t2.end IS NOT NULL;
>
> Запрос работает правильно, но слишком долго - EXPLAIN говорит:
>
> table type possible_keys key key_len ref rows Extra
> t2 ALL NULL NULL NULL NULL 16 where used
> t1 ALL serial NULL NULL NULL 106422 where used
>
> Если убрать из запроса t2 и в BETWEEN поставить константы, то запрос проходит мнговенно.
>
> Пробовал разные виды JOIN-а. Читал мануал (и не раз, и не только сейчас ;) - BETWEEN допускается для работы с индексами. Не пойму в чем дело - как должно работать логически понятно, а как работает - нет. Кто-нибудь знает в чем дело?
> Версия MySQL 3.23.49.
>
>


From: RXL - 20/03/2003 - 14:06:45
Subject:Индексы в BETWEEN при join-е
-----------------
Таблица t1 - это лог, в котором поисходят растянутые во времени события, начало и конец которых записываются в t2 в виде begin и end как текушие (на момент начала/конца события) значения MAX(t1.id).

Как я понимаю: из t2 выбираются все строки, для каждой строки из t2 в WHERE подставляется значения и по ним выбирается диапазон строк в t1. Т.е., EXPLAIN для t1 должен был написать type=range, а не ALL.
Про малопонятные "30%" я читал. Для сравнения:
WHERE t1.id BETWEEN 1 AND 10;
WHERE t1.id BETWEEN t2.begin AND t2.end; # t2.begin=1 t2.end=10
Почему в первом случае <30%, а во втором нет? ж)

t1 rows=106422 - это лог за 1 месяц, а t2 rows=16 - это пока за два дня. Этот запрос у меня выполняется за 1.75 сек. Т.е., после отладки и через пару месяцев он будет выполнятся секунд за 30. Это не серьезно. Запрос с константами в BETWEEN быполняется за ~0.01 сек.

Буду считать это недоработкой в mysql.

Кстати, нашел еще один глюк:
SELECT * FROM t1 NARURAL JOIN t2 WHERE ....;
При вводе была допушена ошибка - "NARURAL" вместо "NATURAL", - но mysql об ошибке синтаксиса ни чего не зказал, а начал выполнять запрос. Конца я не дождался. После исправления запрос прошел моментом. EXPLAIN для этих двух вариантов выдается разный.

Всем спасибо.


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

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

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



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