索引列查询的UNION
替换OR
,真的是老生常谈的性能点子了。一般OR
在多个索引列里用,挺容易把好好的索引直接废掉,走全表扫描,想想就头疼。嗯,换成UNION
,每个条件单独走索引,结果再拼一起,响应也快,执行计划也清爽。
要是你还没试过,来看个例子:
SELECT LOC_ID , LOC_DESC , REGION FROM LOCATION WHERE LOC_ID = 10
UNION
SELECT LOC_ID , LOC_DESC , REGION FROM LOCATION WHERE REGION = "MELBOURNE"
比下面这种靠谱多了:
SELECT LOC_ID , LOC_DESC , REGION FROM LOCATION WHERE LOC_ID = 10 OR REGION = "MELBOURNE"
前面那种用UNION
,每个条件能单独用索引,效率比OR
高一大截。
哦,顺便提醒下,只对多个索引列效果好,一个字段上用OR
没啥影响,别乱用哈。感兴趣的你可以顺手看看这些文章,优化点子还挺多:
Oracle SQL 索引列避免使用 NOT 优化指南、ORACLE SQL 性能优化:索引列与计算,还有 优化 MySQL SQL 查询性能建立高效多列索引。
如果你平时写Oracle
或MySQL
,下次碰到OR
,先琢磨下能不能拆开用UNION
,大表场景下差别挺的。