在 SQL 查询中使用 OR
语句可能导致数据库优化器无法有效地使用索引,
从而可能导致全表扫描,这会影响查询性能。
一个常见的优化替代方案是使用 UNION
进行查询拆分,
这样可以更好地利用索引,从而提高查询性能。
示例
假设你有一个包含用户信息的表 users
,其中有两个列 status
和 role
,并且你需要查找 status
为 ‘active’ 或 role
为 ‘admin’ 的用户:
使用 OR 的查询:
SELECT * FROM users
WHERE status = 'active' OR role = 'admin';
这个查询可能导致全表扫描,尤其是在 status
和 role
列没有好的复合索引时。
使用 UNION 的查询:
可以将其转换为两个单独的查询,并用 UNION
合并结果:
SELECT * FROM users WHERE status = 'active'
UNION
SELECT * FROM users WHERE role = 'admin';
优点
- 提高性能:如果
status
和role
列单独地都有索引,这种写法可能会利用到各自的索引,而不是进行全表扫描。 - 避免重复计数:
UNION
默认去除重复的结果(如果你确实需要考虑重复),这与逻辑条件的要求一致。
注意事项
UNION
会去除重复项,如果你不需要去重,可以用UNION ALL
,这样在某些情况下可能更快,因为不需要执行去重操作。- 仅当两个条件没有必要同时满足时(即不会有重复的结果),
UNION
的优化才更为有效。
在使用之前,确保对表结构、索引设计和查询需求有深刻理解,因为不是所有情况下 UNION
都是最佳选择,具体优化也需根据实际场景进行调整。