需求
字段varchar 多个可能查询,使用where in/where or/ find_in_set不同查询比较。
符合条件记录数为 3735 条。
FIND_IN_SET
+----+-------------+----------------+------------+------+---------------+---------+---------+-------+---------+----------+-----------------------------------------------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+----------------+------------+------+---------------+---------+---------+-------+---------+----------+-----------------------------------------------------------+
| 1 | SIMPLE | adjust_tracker | NULL | ref | idx_nca | idx_nca | 152 | const | 2227895 | 100.00 | Using where; Using index; Using temporary; Using filesort |
+----+-------------+----------------+------------+------+---------------+---------+---------+-------+---------+----------+-----------------------------------------------------------+
1 row in set, 1 warning (0.03 sec)
WHERE IN
+----+-------------+----------------+------------+-------+---------------+---------+---------+------+-------+----------+-----------------------------------------------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+----------------+------------+-------+---------------+---------+---------+------+-------+----------+-----------------------------------------------------------+
| 1 | SIMPLE | adjust_tracker | NULL | range | idx_nca | idx_nca | 454 | NULL | 13316 | 100.00 | Using where; Using index; Using temporary; Using filesort |
+----+-------------+----------------+------------+-------+---------------+---------+---------+------+-------+----------+-----------------------------------------------------------+
1 row in set, 1 warning (0.00 sec)
WHERE OR
+----+-------------+----------------+------------+-------+---------------+---------+---------+------+-------+----------+-----------------------------------------------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+----------------+------------+-------+---------------+---------+---------+------+-------+----------+-----------------------------------------------------------+
| 1 | SIMPLE | adjust_tracker | NULL | range | idx_nca | idx_nca | 454 | NULL | 13316 | 100.00 | Using where; Using index; Using temporary; Using filesort |
+----+-------------+----------------+------------+-------+---------------+---------+---------+------+-------+----------+-----------------------------------------------------------+
1 row in set, 1 warning (0.00 sec)
结论
- find_in_set 需要匹配的行数最多,时间最久
- where in 和 where or 匹配的行数一样多
- 尽量避免使用 find_in_set
本文对比了在MySQL中,使用FIND_IN_SET、WHERE IN以及WHERE OR查询效率,实验结果显示,FIND_IN_SET效率最低,而WHERE IN和WHERE OR在相同条件下表现相当,建议尽量避免使用FIND_IN_SET。
615

被折叠的 条评论
为什么被折叠?



