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

12
L
На сайте с 10.02.2015
Offline
171
#11
Dram #:

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)

STRAIGHT_JOIN делать так:

EXPLAIN
SELECT
        *
FROM
        xyfq1_items AS t2
STRAIGHT_JOIN
        xyfq1_professions AS t1 ON t1.item_id = t2.id
WHERE
        (t2.average > 0 OR t2.comments > 0)

А что выводит

EXPLAIN
SELECT
        *
FROM
        xyfq1_items AS t2
WHERE
        (t2.average > 0 OR t2.comments > 0)

и

EXPLAIN
SELECT
        *
FROM
        xyfq1_items AS t2
WHERE
        t2.average > 0

и

EXPLAIN
SELECT
        *
FROM
        xyfq1_items AS t2
WHERE
        t2.comments > 0
D
На сайте с 28.06.2008
Offline
1066
#12

STRAIGHT_JOIN делать так:

А что выводит

и


и

форсирование индекс при селекте только по второй таблице работает 

если в Селекте звездочку заменить на id, то индекс начинает работать


L
На сайте с 10.02.2015
Offline
171
#13

Вы говорили, выбирается 200 полей, правда с JOIN

Но EXPLAIN говорит, что по каждому индексу найдено полтаблицы

Mysql решает, что быстрее всю таблицу считать, чем мудохаться с индексом

Покажите инфу по индексам второй таблицы

D
На сайте с 28.06.2008
Offline
1066
#14
livetv #:

Вы говорили, выбирается 200 полей, правда с JOIN

Но EXPLAIN говорит, что по каждому индексу найдено полтаблицы

Mysql решает, что быстрее всю таблицу считать, чем мудохаться с индексом

Покажите инфу по индексам второй таблицы

Я имел в виду что под условие попадет 230K примерно. Да, вы вероятно правы, мускуль решает что реально проще всю таблицу оббежать ибо индексы по двум полям выборки как раз по 30% таблицы примерно 

L
На сайте с 10.02.2015
Offline
171
#15

А так?

EXPLAIN
UPDATE
        xyfq1_professions AS t1
INNER JOIN
        xyfq1_items AS t2 ON t1.item_id = t2.id
SET
        t1.comments = t2.comments
WHERE
        t2.comments > 0

Но это будет необходимо делать 2 запроса. И смотреть на время без 

EXPLAIN
D
На сайте с 28.06.2008
Offline
1066
#16

Проанализировав таблицу t2 я понял что условие (t2.average > 0 OR t2.comments > 0) избыточно и можно сократить просто до  t2.average > 0

но к сожалению это никак не ускорило запрос, он по прежнему выполняется более 2 сек.

тут уже можно форсировать индекс и вроде бы как вот оно,

но нет - запрос все так же выполняется более 2 сек. Форсирование никак не убыстряет запрос, все так и пляшет в районе 2,1 сек. Что с форсированием, что без.

L
На сайте с 10.02.2015
Offline
171
#17
В SET должны быть поля того индекса, который в фильтре WHERE
12

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