mysql"IN"运算符删除几行或几个查询?哪个更快?

Ahm*_*ed 1 mysql sql

我正在使用MySQL.表引擎是MyIsam

哪种方法更快?

DELETE FROM TABLE WHERE id IN (1,2,3);
Run Code Online (Sandbox Code Playgroud)

要么

DELETE FROM TABLE WHERE id = 1; 
DELETE FROM TABLE WHERE id = 2;
DELETE FROM TABLE WHERE id = 3;
Run Code Online (Sandbox Code Playgroud)

id字段是PRIMARY KEY

哪一个会更快?

Ale*_*tic 5

IN应该更快,因为mysql将在第二个解决方案中的每个查询之后更新索引并移动数据块,而第一个查询只会发生一次.

这里有一些关于MySQL的测试(对于一个有一个int列和3个varchars的表,填充了随机数据和WHERE中的列上的索引......没有索引就没有意义,因为它需要花费更多的时间案例...但仍然是一个比3个查询更慢的loooot比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> 
Run Code Online (Sandbox Code Playgroud)

因此,这三个查询花了很多时间7.39s vs 5.25s 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 ;
Run Code Online (Sandbox Code Playgroud)

  • 并减少服务器/客户端和较少的表锁(MyISAM)之间的往返次数. (3认同)
  • 数据库引擎将解析一个查询而不是三个. (2认同)