Изключително съм объркан и разочарован тук -
Имам маса (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 има Using index условие, а еквивалентното delete има using where?
Как мога да принудя изтриването да използва и индекса?
Благодаря ти!
SHOW CREATE TABLE
за двете таблици и версията на MySQL, която използвате. - person Rick James   schedule 27.01.2019