一、先说结论:IN 比 OR 快
假设检索的列为N,IN 的时间复杂度为 O(LogN),而 OR 的时间复杂度为 O(N)
在数据量少于100条时的情况下差别不大
当要检索的列为主键索引时,IN 的执行速度和 OR 差别不大
当要检索的列为普通索引时,IN 的执行速度和 OR 差别不大
当要检索的列没有索引时,IN的执行速度要远大于 OR
例如:1000条左右的数据,没有索引的情况下执行时间 IN 是在秒级别,而OR是分钟级别的。
二、为什么 IN 比 OR 快?
对于下面这条 SQL 语句:
SELECT * FROM tbName WHERE KEY IN (a1, a2, … , an);
SELECT * FROM tbName WHERE KEY = a1 OR KEY = a2 OR … OR KEY = an;
用不上索引的情况下,遍历全表的 key,去匹配 a1, a2, …, an
OR,就是从 a1 匹配,匹配失败,去匹配 a2,直到匹配成功或者一个都匹配不上,时间复杂度是 O(N)
IN,先将 a1, a2, …, an 变成二叉搜索树,用过二叉树查找,时间复杂度为O(LogN)
因此,IN 的效率要高于 OR,参数集合范围越大,IN 的性能不会太大下降,而 OR 会下降非常厉害。