大国家:OR 条件与 UNION 的取舍
LeetCode 595 · 多条件过滤、OR 与索引
面试怎么回答
直接 WHERE area > 3000000 OR population > 25000000。如果 area 和 population 各有索引而优化器没做 index merge,我会改写成两个查询 UNION,让每个条件走自己的索引;这里要用 UNION 去重,因为同一个国家可能同时满足两个条件。
先把这段讲顺;面试官追问时,再展开下面的原理和细节。
详细讲解
题意
国家表有面积和人口。面积超过 300 万平方公里或人口超过 2500 万的算大国家,输出这些国家的名称、人口和面积。
表结构
- World:name(主键)、continent、area、population、gdp
思路
两个条件满足其一即可,直接用 OR。这道题常被用来聊 OR 的性能:两个条件分别落在不同的索引上时,OR 可能导致全表扫描,改写成两个查询 UNION 后可以各自走索引(数据库也可能自动做 index merge)。
参考解法
select name ,population,area
from World
where area >3000000 or population >25000000
另一种写法:UNION 写法,两个条件分别走各自的索引
SELECT name, population, area FROM World WHERE area > 3000000
UNION
SELECT name, population, area FROM World WHERE population > 25000000
易错点
- UNION 会去重,UNION ALL 不去重;这里一个国家可能同时满足两个条件,要用 UNION。