Я не уверен, что две секунды - это «убийственный» запрос (хотя это, конечно, зависит от ваших обстоятельств и потребностей), но одна вещь, которую вы могли бы проверить, это эффект разделения запроса на две части.
Это потому, что в настоящее время он удаляет записи, соответствующие любому из условий, поэтому его легко преобразовать в два оператора delete
(в транзакции, если вы хотите убедиться, что она атомарна). Вы можете попробовать:
DELETE FROM f WHERE ft != 'f';
DELETE FROM f WHERE fs NOT IN (
SELECT fs FROM f
GROUP BY fs
HAVING COUNT(fs) >1);
и посмотрим, улучшится ли это. Это может или не может, в зависимости от вашей СУБД и состава ваших данных. Скорее всего, избавится от перекрестных записей (тех, которые удовлетворяют обоим условиям) в наиболее вероятном и более быстром первом запросе.
Но, как и при всех оптимизациях базы данных, мера, не угадывайте!
Тогда вы можете либо рекомбинировать и переоценивать, либо сосредоточиться на ускорении второго более простого запроса, если это все еще проблема.
Одна вещь, которую особенно должен убедиться: иметь индексы для столбцов ft
и fs
. Это должно немного ускорить ваши запросы, если у вас их еще нет.