Я очень смущен и расстроен здесь -
У меня есть таблица (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 имеет использование условия индекса, а эквивалентный оператор удаления имеет использование где?
Как я могу заставить удаление также использовать индекс?
Благодарю вас!
SHOW CREATE TABLE
для обеих таблиц и версии MySQL, которую вы используете. - person Rick James   schedule 27.01.2019