На основании вашего оператора CREATE
у вас нет индекса для столбца type
.Итак, ваша проблема связана с медленным предложением WHERE
.По сути, ваш запрос вынуждает сервер баз данных просматривать каждую строку, чтобы определить, является ли значение в столбце type
"delete"
.Это медленно, независимо от того, сколько у вас строк.Индекс сделает это намного быстрее, потому что сервер может просто запросить список всех соответствующих строк, а затем работать только с этими строками.
В качестве очень широкого практического правила, если вы собираетесь использовать столбецв предложении WHERE
он должен быть проиндексирован.(Конечно, есть исключения, но это не одно из них в зависимости от того, что вы опубликовали.)
Чтобы узнать, что делает сервер базы данных, запустив запрос EXPLAIN
, как в
EXPLAIN DELETE FROM database WHERE type="delete"
Исходя из вашего комментария, ваш EXPLAIN
возвращает что-то вроде этого:
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 SIMPLE images ALL null null null null 145669 Using where
Что 145,699, которые вы видите, не являются (как вы написали в комментарии) "размер строк ".Это количество строк, на которое сервер должен посмотреть, чтобы выполнить ваш запрос.Как видите, у него нет индексов, которые он может использовать.Таким образом, вместо просмотра только тех строк, которые вы хотите удалить, нужно взглянуть на 145 669 строк.
Кроме того, поскольку ваш столбец type
является столбцом TEXT
, это будет еще медленнее.Вы должны серьезно рассмотреть возможность добавления TINYINT
, CHAR
(не TEXT
) или другого столбца для хранения статуса строки, если вы собираетесь пометить строки для удаления таким способом.
На болееобщее примечание, вы действительно должны пересмотреть некоторые из этих типов столбцов.Я серьезно сомневаюсь, что вам нужно 2^16 - 1
байт для столбца с именем name
, например.