SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 14.05.2008 14:53:57

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Ещё вопрос по индексу

Такой вопрос назрел.
К примеру, есть две таблицы
t1 с полями f1,f2,f3 и
t2 с полями f4,f5,f6 и индексом поля f5
Если джоинить таблицы по полям f5=f1, используется индекс поля f5, но если в WHERE присутвует условие f6=X, то это поле можно добавить в индекс поля f5 или нужно создать новый индекс? Или для этого поля уже не будет использоваться никакой индекс?


Человек без чувства юмора - не серьёзный человек wink

Неактивен

 

#2 15.05.2008 00:18:09

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Ещё вопрос по индексу

Он при JOIN сначала ищет значение f5, равное f1, затем нужно значение f6. В этом случае подойдет составной индекс KEY(f5,f6). Надо конечно убедиться, что JOIN именно в этом порядке будет выполняться. WHERE часто перетягивает на себя и MySQL начнет выполнять JOIN начиная со второй таблицы. Тогда key(f6), а в первой key(f1).

Неактивен

 

#3 16.05.2008 12:42:58

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Re: Ещё вопрос по индексу

Хм, интересная новость на счёт WHERE... А никак не удастся заставить обрабатывать джоины именно в указанном порядке? Потому-что в реальном запросе джоинятся 7 таблиц, а WHERE фильтрует записи первых двух таблиц.


Человек без чувства юмора - не серьёзный человек wink

Неактивен

 

#4 16.05.2008 14:32:33

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Ещё вопрос по индексу

Посмотрите EXPLAIN как оптимизатор решил выполнять Ваш запрос. Если не нравится, напишите SELECT STRAIGHT_JOIN ..., тогда JOIN будет в порядке следования таблиц

Неактивен

 

#5 16.05.2008 19:52:08

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Re: Ещё вопрос по индексу

Т.е. в эксплейне показывается тот порядок, который используется при работе запроса?
Ок, а есть гарантии, что этот порядок не изменится со временем, скажем, из-за глобального потепления или неправильной позиции звёзд?))))


Человек без чувства юмора - не серьёзный человек wink

Неактивен

 

#6 16.05.2008 19:57:30

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Ещё вопрос по индексу

Гарантия есть, только если используете STRAIGHT_JOIN. Если не используете, то оптимизатор вправе каждый раз выбирать порядок, исходя из статистики таблиц (может также зависеть о значения констант в запросе). Пример для последнего поведения такой: У Вас есть WHERE age = -100, оптимизатор знает, что в таблице минимальное значение age 10, поэтому WHERE сразу даст пустое множество и с него легче начать обработку. Если WHERE age=20 дает много результатов, то оптимизатор может начать с другой таблицы, в которой условие WHERE более конкретно.

Неактивен

 

#7 19.05.2008 11:34:45

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Re: Ещё вопрос по индексу

Ясно, спасибо smile


Человек без чувства юмора - не серьёзный человек wink

Неактивен

 

#8 19.05.2008 13:40:04

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Re: Ещё вопрос по индексу

Хм, попытался применить STRAIGHT_JOIN вместо LEFT JOIN, так база ругнулась
#1062 - Duplicate entry
Что это может означать? Конечно у меня много записей t2.t1_id = t1.id, неужели из-за этого?


Человек без чувства юмора - не серьёзный человек wink

Неактивен

 

#9 19.05.2008 23:02:55

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Ещё вопрос по индексу

Нет. В этом случае ошибка была бы другой. Что-то типа неопределенность в имени столбца.

Скорее всего дело в том, что STRAIGHT_JOIN аналогичен JOIN, а не LEFT JOIN, т.е. не включает строки не имеющие соответствия.

Неактивен

 

#10 19.05.2008 23:10:10

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Ещё вопрос по индексу

STRAIGHT_JOIN это не вид JOIN, а специальный оператор, который надо указывать сразу после SELECT для того, чтобы объединение шло в том же порядке

SELECT STRAIGHT_JOIN * FROM users JOIN articles ....

Неактивен

 

#11 13.06.2008 10:58:01

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Re: Ещё вопрос по индексу

Я удаляю из нескольких таблиц сразу и выборка записей происходит по джоинам. Эксплейн селекта такой выборки показал неправильный порядок, STRAIGHT_JOIN решил этот вопрос. Как быть с удалением? По идее, оптимизатор тоже неправильно строит порядок джоинов. Как быть?


Человек без чувства юмора - не серьёзный человек wink

Неактивен

 

#12 14.06.2008 09:52:29

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Ещё вопрос по индексу

Попробуйте такой синтаксис:

DELETE FROM a,b USING a STRAIGHT_JOIN b WHERE a.id = b.id AND b.value=10;

Неактивен

 

#13 16.06.2008 20:30:51

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Re: Ещё вопрос по индексу

Судя по всему, не помогло, ибо запрос очень долго выполняется, либо я его не правильно составил. У меня используется 4 таблицы. При попытке запустить запрос
DELETE a,b,c,d FROM a USING STRAIGHT_JOIN b,c,d ...
получаю ошибку, а запрос
DELETE FROM a USING STRAIGHT_JOIN b,c,d ...
вродь запустился, но по времени работает столько же, сколько и без STRAIGHT_JOIN.
Из таблицы `a` выбираем записи по константе, а остальные соединяются по ключам.


Человек без чувства юмора - не серьёзный человек wink

Неактивен

 

#14 16.06.2008 20:38:55

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Ещё вопрос по индексу

попробуйте
DELETE FROM a USING a STRAIGHT_JOIN b ON ... STRAIGHT_JOIN c ON ... STRAIGHT_JOIN d ON ...

Неактивен

 

#15 19.06.2008 20:54:39

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Re: Ещё вопрос по индексу

На такой запрос сервер ругнулся синтаксической ошибкой начиная с "ON ... STRAIGHT_JOIN c ON ... STRAIGHT_JOIN d ON ..." sad

Уважаемые, ещё будут идеи? smile


Человек без чувства юмора - не серьёзный человек wink

Неактивен

 

#16 20.06.2008 02:00:39

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 849

Re: Ещё вопрос по индексу

А так:

DELETE a FROM a STRAIGHT_JOIN b ON ... STRAIGHT_JOIN c ON ... STRAIGHT_JOIN d ON ...

?

Неактивен

 

#17 20.06.2008 03:53:05

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Ещё вопрос по индексу

На оба варианта у меня не возникает синтаксической ошибки, mysql-5.0.22
mysql> DELETE FROM users USING users STRAIGHT_JOIN u ON u.id=users.id STRAIGHT_JOIN xx ON xx.i=u.id;
Query OK, 0 rows affected (0.01 sec)
mysql> DELETE users FROM users STRAIGHT_JOIN u ON u.id=users.id STRAIGHT_JOIN xx ON xx.i=u.id;
Query OK, 0 rows affected (0.00 sec)

Неактивен

 

#18 20.06.2008 12:55:44

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Re: Ещё вопрос по индексу

Странно однако на счёт синтаксиса.. У меня 5.0.51а. В общем, решил проблему циклами на стороне клиента.


Человек без чувства юмора - не серьёзный человек wink

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson