MySQL игнорирует индекс силы для удаления запроса, но не для эквивалентного запроса выбора - PullRequest
0 голосов
/ 26 января 2019

Я очень смущен и разочарован -

У меня огромная таблица (table1).

Я пытаюсь выполнить запрос на удаление, основанный на другой таблице.Оптимизатор запросов не использует соответствующий индекс, поэтому я пытаюсь заставить его

delete table1 
FROM table1
FORCE INDEX FOR JOIN (index1)  
inner JOIN table2  
where
table1.field1=table2.field1
and
table1.field2=table2.field2
and
date(table1.startdatetime)=table2.reportdate;

Эквивалентный выбор выглядит следующим образом:

SELECT * 
FROM table1
FORCE INDEX FOR JOIN (index1)  
inner JOIN table2  
where
table1.field1=table2.field1
and
table1.field2=table2.field2
and
date(table1.startdatetime)=table2.reportdate;

Что я не понимаю, так эточто запрос на удаление не использует индекс, а запрос на выборку

"объяснение" из выбора:

1   SIMPLE  table2 index    idx1    idx1    55      1456    Using where; Using index
1   SIMPLE  table1 ref  index1 index1 51    table2.field1,table2.field2 508 **Using index condition**

Но объяснение удаления заключается в следующем:

# id, select_type, table, type, possible_keys, key, key_len, ref, rows, Extra
1, SIMPLE, table2, index, idx1, idx1, 55, , 1456, Using where; Using index
1, SIMPLE, table1, ref, index1, index1, 51, table2.field1,table2.field2, 508, Using where

Почему оператор select имеет Использование условия индекса и эквивалентное удаление имеет с использованием где ?

Как заставить принудительно удалитьиспользовать индекс также?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 27 января 2019

Неэффективность может быть

date(table1.startdatetime)=table2.reportdate

Нельзя использовать индекс startdatetime, поскольку он скрывается внутри вызова функции. Обычно лучше сделать:

    table1.startdatetime >= table2.reportdate
AND table1.startdatetime  < table2.reportdate + INTERVAL 1 DAY
0 голосов
/ 26 января 2019

Индексные подсказки применяются только к операторам SELECT.(Они принимаются синтаксическим анализатором для операторов UPDATE, но игнорируются и не имеют никакого эффекта.)

из официальные документы

Даже если это не определенновызванный, я бы предположил, что DELETE подпадает под обработку UPDATE, а не SELECT.

...