Не используется индекс при UPDATE

12
D
На сайте с 28.06.2008
Offline
1108
1017

Вроде простой запрос, но не могу заставить оптимизатор использовать индекс  item_id у таблицы t1

force index пробовал, он просто игнорируется. Как так?  ПРобовал сделать аналогичный селект (чисто посмотреть как селект будет отрабатывать), тоже самое, индекс не используется. Я уже и удалил его и заново создал - пофиг.



Индексы таблицы t1



L
На сайте с 10.02.2015
Offline
249
#1
Ждем час, пока ТС сам напишет ответ
L
На сайте с 10.02.2015
Offline
249
#2

С информации об индексах и EXPLAIN можно сделать вывод, что таблицы имеют одинаковое число записей, 1 к 1.

А также индексу по сути не чего фильтровать, базе нужно прочитать всю таблицу.

Можете условие с WHERE переместить в ON для JOIN.

D
На сайте с 28.06.2008
Offline
1108
#3
livetv #:

С информации об индексах и EXPLAIN можно сделать вывод, что таблицы имеют одинаковое число записей, 1 к 1.

А также индексу по сути не чего фильтровать, базе нужно прочитать всю таблицу.

Можете условие с WHERE переместить в ON для JOIN.

Всего в таблице более 700K записей. Условие WHERE отбирает чуть более 200, но почему то сканируя всю таблицу. Перемещать  WHERE в ON для JOIN пробовал, без эффекта.

D
На сайте с 28.06.2008
Offline
1108
#4

Вот эксплейн селекта

Вот убрал Where

Вот с форсирование индекса (может не так форсирую?)


L
На сайте с 10.02.2015
Offline
249
#5

Ну фильтрация происходит по полям второй таблицы

Lazy Badger
На сайте с 14.06.2017
Offline
228
#6
livetv #:

Ну фильтрация происходит по полям второй таблицы

А для первой даже ORDER BY нет

Производство жести методом непрерывного отжига
L
На сайте с 10.02.2015
Offline
249
#7

Возможно в первой таблице лишние индексы

Можно попробовать поменять порядок JOIN и джойнить через STRAIGHT_JOIN

Возможно OR нужно заменить на 2 запроса, чтобы каждый запрос мог заюзать индекс второй таблицы

D
На сайте с 28.06.2008
Offline
1108
#8
Так Джойнится всего одна таблица, как тут можно порядок менять?
L
На сайте с 10.02.2015
Offline
249
#9

Сбросьте весь запрос текстом

D
На сайте с 28.06.2008
Offline
1108
#10
livetv #:

Сбросьте весь запрос текстом

UPDATE  xyfq1_professions AS t1

inner JOIN  STRAIGHT_JOIN xyfq1_items AS t2 

SET t1.average = t2.average, t1.comments = t2.comments 

WHERE t1.item_id = t2.id and (t2.average > 0 OR t2.comments > 0)

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий