我玩过 MySQL EXPLAIN:
平等的
mysql> explain extended select * from document_name_ownerships as dno join document_names as dn on dn.id = dno.document_name_id where dn.id = 18 ;
+----+-------------+-------+-------+---------------+---------+---------+-------+------+----------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+----------+-------------+
| 1 | SIMPLE | dn | const | PRIMARY | PRIMARY | 4 | const | 1 | 100.00 | |
| 1 | SIMPLE | dno | ALL | NULL | NULL | NULL | NULL | 81 | 100.00 | Using where |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+----------+-------------+
2
rows in set, 1 warning (0.00 sec)
在()
mysql> explain extended select * from document_name_ownerships as dno join document_names as dn on dn.id = dno.document_name_id where dn.id in(18) ;
+----+-------------+-------+-------+---------------+---------+---------+-------+------+----------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+----------+-------------+
| 1 | SIMPLE | dn | const | PRIMARY | PRIMARY | 4 | const | 1 | 100.00 | |
| 1 | SIMPLE | dno | ALL | NULL | NULL | NULL | NULL | 81 | 100.00 | Using where |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+----------+-------------+
2 rows in set, 1 warning (0.01 sec)
因此,当涉及到一条记录时,似乎等于 (=)比IN()快得可以忽略不计
但有趣的是,当我做了几个项目时,结果是一样的:
mysql> explain extended select * from document_name_ownerships as dno join document_names as dn on dn.id = dno.document_name_id where dn.id = 18 or dn.id=17 or dn.id=19;
> (0.00 sec)
mysql> explain extended select * from document_name_ownerships as dno join document_names as dn on dn.id = dno.document_name_id where dn.id in (18, 17, 19);
> (0.00 sec)
但不知道这个结果是否可以在实时服务器上被信任,因为在我的开发机器上我有 SSD 驱动器......但对我来说似乎一样
更新
有 70000 条记录
select * from document_name_ownerships as dno join document_names as dn on dn.id = dno.document_name_id where dn.id = 60811;
1 row in set (0.04 sec)
select * from document_name_ownerships as dno join document_names as dn on dn.id = dno.document_name_id where dn.id in( 60811);
1 row in set (0.04 sec)
多
select * from document_name_ownerships as dno join document_names as dn on dn.id = dno.document_name_id where dn.id in( 60800, 11111, 22222, 40000);
4 rows in set (0.07 sec)
select * from document_name_ownerships as dno join document_names as dn on dn.id = dno.document_name_id where dn.id = 60800 or dn.id = 11111 or dn.id = 22222 or dn.id = 40000;
4 rows in set (0.08 sec)