判断含NULL值的两列相等的两种查询语句的索引使用差异
两列含NULL值相等判断的索引使用差异分析
假设列x和y都已创建索引,两种查询谓词的索引使用情况存在明显差异:
第一种写法:WHERE (x=y OR x IS NULL AND y IS NULL)
x=y部分:数据库可直接利用x和y的索引做等值匹配,比如通过合并索引扫描或嵌套循环的方式快速定位匹配行;x IS NULL AND y IS NULL部分:多数数据库的索引会存储NULL值,IS NULL条件可以直接命中索引中的NULL条目,同样能高效利用索引;- 整体逻辑是OR连接的两个可索引条件,数据库通常会分别执行两个索引扫描操作,再合并结果集,性能表现较好。
第二种写法:WHERE IFNULL(x, falseyValueForType)=IFNULL(y, falseyValueForType)(例如数值型用WHERE IFNULL(x,0)=IFNULL(y,0))
- 这种写法对索引列x和y都使用了IFNULL函数,属于函数直接作用在索引列上。在没有专门创建对应表达式索引的情况下,数据库无法直接利用现有索引——因为索引存储的是列的原始值,而查询需要匹配的是函数计算后的结果,只能进行全表扫描或索引全扫描,性能远不如第一种写法;
- 除非提前为
IFNULL(x, falseyValueForType)和IFNULL(y, falseyValueForType)创建函数/表达式索引,否则无法走索引加速查询。
核心差异总结
第一种写法能充分利用x和y的现有索引,执行效率高;第二种写法在无额外函数索引的情况下,完全无法利用现有索引,查询性能会显著下降。
内容的提问来源于stack exchange,提问作者David542
相关产品推荐
相关产品推荐

