IN должно быть быстрее, потому что mysql будет обновлять ваши индексы и перемещать блоки данных после каждого запроса в вашем втором решении, в то время как это произойдет только один раз с первым запросом.
А вот некоторые тесты на MySQL(для таблицы, имеющей один столбец int и 3 varchars, заполненных случайными данными и по индексу для столбца в WHERE ... без индекса нет смысла, поскольку в обоих случаях это занимает намного больше времени ... но все жеLooot медленнее с 3 запросами, чем IN).
mysql> call prepare_data();
Query OK, 1 row affected (34.25 sec)
mysql> delete from t1 where trt in (5, 6, 7);
Query OK, 300049 rows affected (5.25 sec)
mysql> call prepare_data();
Query OK, 1 row affected (35.18 sec)
mysql> delete from t1 where trt=5;delete from t1 where trt=6;delete from t1 where trt=7;
Query OK, 99961 rows affected (2.25 sec)
Query OK, 99842 rows affected (2.38 sec)
Query OK, 99558 rows affected (2.69 sec)
mysql>
Таким образом, эти три запроса заняли намного больше времени - 7,39 с против 5,25 с для IN, что на 40% больше).Вот процедура prepare_data:
DELIMITER $$
CREATE PROCEDURE prepare_data()
BEGIN
DECLARE i INT DEFAULT 0;
TRUNCATE TABLE t1;
WHILE i < 1000000 DO
INSERT INTO t1 (a, b, c, trt) VALUES ('fasdfadsf', 'asdfasdfa', 'asdfasdf', FLOOR( 1 + RAND( ) *10 ));
SET i = i + 1;
END WHILE;
END $$
DELIMITER ;