Назад | Перейти на главную страницу

Оптимизация удаления MYSQL

У меня есть следующий оператор SQL для удаления:

delete w,r from table1 w, table2 r where (w.status=1 or r.status=1)

show engine innodb status показывает следующее. скорость чтения (237,29 чтения / с) относится к чтениям после условия фильтра (где)? или это относится ко всем элементам соединения до фильтра? Это важно, так как я пытаюсь оценить время, необходимое для завершения запроса. Обе таблицы очень большие, но отфильтрованные результаты относительно малы.

ROW OPERATIONS
--------------
1 queries inside InnoDB, 0 queries in queue
1 read views open inside InnoDB
Main thread process no. 5163, id 1090357568, state: waiting for server activity
Number of rows inserted 25005429, updated 1722842, deleted 371088, read 2176564571
0.00 inserts/s, 0.00 updates/s, 0.00 deletes/s, 237.29 reads/s

Я ошибаюсь или вы не указали какое-либо условие соединения для w и r? Это означает, что вы выполняете большое декартово соединение обеих таблиц, это определенно будет длиннее двух запросов на удаление, по одному в каждой таблице.

Разве у вас нет чего-то, что связывает w и r друг с другом, например:

delete w,r 
from table1 w ,table2 r 
where (w.r_id=r.r_id) 
and (w.status=1 or r.status=1)

или, по крайней мере, вы можете присоединиться к ним в поле статуса. И очевидно, что индексирование поля статуса просто необходимо.