MySQL函数参数传递机制(值/引用/惰性)及大字段读取优化问询
MySQL IF函数短路求值与大字段读取问题
问题
我有两条SQL语句:
select if(some_cond, some_varchar, some_large_text) from fooselect if(some_cond, some_varchar, md5(some_large_text)) from foo
想请教:当some_cond求值为true时,MySQL引擎会不会实际读取some_large_text?
另外我也梳理了几种假设场景:
- 如果是惰性求值:两条SQL都不会读
some_large_text - 如果是引用传递:只有第二条SQL需要读
some_large_text - 如果是值传递:该怎么避免读取大字段的额外开销?
解答
MySQL内置函数的参数求值逻辑由其底层C++代码实现决定。比如SHA2(data, bits)函数,源码里明确做了判断:当第一个参数data为null时会直接提前返回,不会去处理第二个参数bits——这就是典型的短路求值逻辑。
回到你的问题,IF函数的实现同样遵循短路求值规则:当some_cond为true时,MySQL会直接返回第二个参数some_varchar,完全不会去计算或读取第三个参数对应的内容——不管第三个参数是直接的some_large_text字段,还是嵌套了md5()的表达式。
所以结论很明确:当some_cond为true时,你给出的两条SQL都不会读取some_large_text,自然也就不会产生大字段的不必要IO开销。
内容的提问来源于stack exchange,提问作者yyyy
相关产品推荐
相关产品推荐

