SELECT DISTINCT
*
FROM
test
WHERE
cid = 123456
AND (
(eid = 7890123)
OR sid IN (
SELECT
sid
FROM
test
WHERE
cid = 123456
GROUP BY
sid
HAVING
COUNT(*) = 1
)
)
优化之使用union代替or
SELECT DISTINCT
*
FROM
test
WHERE
cid = 900458
AND eid = 1021355 UNION
SELECT
sid
FROM
test
WHERE
cid = 900458
GROUP BY
sid
HAVING
COUNT( * ) = 1
Union比OR更快?
-
严格地讲,用Union更快仅限于扫描两个不同的列
(当然,UNION ALL 比 UNION 更快) -
MySQL 通常是使用一个索引来扫描表的,如果有两个索引的时候,第二个索引就要再扫一边
如果时用UNION就是两次都扫一个索引。
(我觉得第一个时间复杂度时O(logn*logn), 第二个是O(logn * 2), 忽略常数时间复杂度不变 -
benchmark 关于 UNION 和 OR, 有下表
-
Scenario 3: Selecting all columns for different fields
CPU Reads Duration Row Counts OR 47 1278 443 1228 UNION 31 1334 400 1228 -
Scenario 4: Selecting Clustered index columns for different fields
CPU Reads Duration Row Counts OR 0 319 366 1228 UNION 0 50 193 1228
-
-
总结:
- 从benchmark的表上来看不加索引的话几乎没区别, 甚至用OR的读性能更好。
- 我觉得在性能不是特别敏感的时候,还是用or比较好。因为代码简介,可读性高。反之用Union