电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

mysql 字段定義不要用null的原因分析

瀏覽:4日期:2023-10-01 08:09:37
一 NULL 為什么這么經常用

(1) java的null

null是一個讓人頭疼的問題,比如java中的NullPointerException。為了避免猝不及防的空指針,需要小心翼翼地各種if判斷,麻煩又臃腫.

為此有很多的開源包都有諸多處理

common lang3的StringUtils.isBlank(); CollectionUtils.isEmpty();

guava的Optional

甚至java8也引入了Optional來避免這一問題(和guava的大同小異,用法稍有一點點變化)

(2) mysql的null為什么橫行濫用

(a) 創建不規范 null是創建數據表時候默認的,一些mysql客戶端的自動生成表語句里面可能也沒有not null的指定。

(b) 錯誤認識 會有人覺得not null需要更多的空間

(c) 圖省事 null在開發中不用判斷插入數據,寫sql更方便

二 官方文檔

NULL columns require additional space in the rowto record whether their values are NULL. For MyISAM tables, each NULL columntakes one bit extra, rounded up to the nearest byte.

Mysql難以優化引用可空列查詢,它會使索引、索引統計和值更加復雜。可空列需要更多的存儲空間,還需要mysql內部進行特殊處理??煽樟斜凰饕?,每條記錄都需要一個額外的字節,還能導致MYisam 中固定大小的索引變成可變大小的索引。 —— 出自《高性能mysql第二版》

如此看來,不指定not null并沒有性能上的優勢。

三 mysql不用null的理由

(1)所有使用NULL值的情況,都可以通過一個有意義的值的表示,這樣有利于代碼的可讀性和可維護性,并能從約束上增強業務數據的規范性。

(2)NULL值到非NULL的更新無法做到原地更新,更容易發生索引分裂,從而影響性能。(null -> not null性能提升很小,除非確定它帶來了問題,否則不要當成優先的優化措施)

(3)NULL值在timestamp類型下容易出問題,特別是沒有啟用參數explicit_defaults_for_timestamp

(4)NOT IN、!= 等負向條件查詢在有 NULL 值的情況下返回永遠為空結果,查詢容易出錯

四 null引發的bad case

數據初始化:

create table table1 ( `id` INT (11) NOT NULL, `name` varchar(20) NOT NULL)create table table2 ( `id` INT (11) NOT NULL, `name` varchar(20))insert into table1 values (4,'zhaoyun'),(2,'zhangfei'),(3,'liubei')insert into table2 values (1,'zhaoyun'),(2, null)

(1)NOT IN子查詢在有NULL值的情況下返回永遠為空結果,查詢容易出錯

select name from table1 where name not in (select name from table2 where id!=1)

+-------------+| name ||-------------|+-------------+

(2) 列值允許為空,索引不存儲null值,結果集中不會包含這些記錄。

select * from table2 where name != ’zhaoyun’

+------+-------------+| id | name ||------+-------------|| | |+------+-------------+

select * from table2 where name != ’zhaoyun1’

+------+-------------+| id | name ||------+-------------|| 1 | zhaoyun |+------+-------------+

(3) 使用concat拼接時,首先要對各個字段進行非null判斷,否則只要任何一個字段為空都會造成拼接的結果為null

select concat('1', null) from dual;

+--------------------+| concat('1', null)||--------------------|| NULL |+--------------------+

(4) 當計算count時候null column不會計入統計

select count(name) from table2;

+--------------------+| count(user_name) ||--------------------|| 1 |+--------------------+五 索引長度對比

alter table table1 add index idx_name (name);alter table table2 add index idx_name (name);explain select * from table1 where name=’zhaoyun’;explain select * from table2 where name=’zhaoyun’;

table1的key_len = 82

table2的key_len = 83

key_len 的計算規則和三個因素有關:數據類型、字符編碼、是否為 NULL

key_len 82 = 20 * 4(utf8mb4 - 4字節, utf8 - 3字節) + 2(存儲varchar變長字符長度為2字節,定長字段無需額外的字節)

key_len 83 = 20 * 4(utf8mb4 - 4字節, utf8 - 3字節) + 2(存儲varchar變長字符長度為2字節,定長字段無需額外的字節) + 1(是否為null的標志)

所以說索引字段最好不要為NULL,因為NULL會使索引、索引統計和值更加復雜,并且需要額外一個字節的存儲空間。

到此這篇關于mysql 字段定義不要用null的分析的文章就介紹到這了,更多相關mysql 字段定義null內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: MySQL 數據庫
相關文章:
主站蜘蛛池模板: 软文发布平台 - 云软媒网络软文直编发布营销推广平台 | 游泳池设计|设备|配件|药品|吸污机-东莞市太平洋康体设施有限公司 | 挤出熔体泵_高温熔体泵_熔体出料泵_郑州海科熔体泵有限公司 | 老房子翻新装修,旧房墙面翻新,房屋防水补漏,厨房卫生间改造,室内装潢装修公司 - 一修房屋快修官网 | 分光色差仪,测色仪,反透射灯箱,爱色丽分光光度仪,美能达色差仪维修_苏州欣美和仪器有限公司 | Brotu | 关注AI,Web3.0,VR/AR,GPT,元宇宙区块链数字产业 | 申江储气罐厂家,储气罐批发价格,储气罐规格-上海申江压力容器有限公司(厂) | 东莞工厂厂房装修_无尘车间施工_钢结构工程安装-广东集景建筑装饰设计工程有限公司 | MTK核心板|MTK开发板|MTK模块|4G核心板|4G模块|5G核心板|5G模块|安卓核心板|安卓模块|高通核心板-深圳市新移科技有限公司 | 球盟会·(中国)官方网站 | PVC地板|PVC塑胶地板|PVC地板厂家|地板胶|防静电地板-无锡腾方装饰材料有限公司-咨询热线:4008-798-128 | 南京雕塑制作厂家-不锈钢雕塑制作-玻璃钢雕塑制作-先登雕塑厂 | 广州云仓代发-昊哥云仓专业电商仓储托管外包代发货服务 | 无菌实验室规划装修设计-一体化实验室承包-北京洁净净化工程建设施工-北京航天科恩实验室装备工程技术有限公司 | 湿地保护| 真空粉体取样阀,电动楔式闸阀,电动针型阀-耐苛尔(上海)自动化仪表有限公司 | 台式低速离心机-脱泡离心机-菌种摇床-常州市万丰仪器制造有限公司 | 精密五金冲压件_深圳五金冲压厂_钣金加工厂_五金模具加工-诚瑞丰科技股份有限公司 | 皮带机_移动皮带机_大倾角皮带机_皮带机厂家 - 新乡市国盛机械设备有限公司 | 老房子翻新装修,旧房墙面翻新,房屋防水补漏,厨房卫生间改造,室内装潢装修公司 - 一修房屋快修官网 | 武汉高低温试验机-现货恒温恒湿试验箱-高低温湿热交变箱价格-湖北高天试验设备 | 气动隔膜阀_气动隔膜阀厂家_卫生级隔膜阀价格_浙江浙控阀门有限公司 | 赛默飞Thermo veritiproPCR仪|ProFlex3 x 32PCR系统|Countess3细胞计数仪|371|3111二氧化碳培养箱|Mirco17R|Mirco21R离心机|仟诺生物 | 12cr1mov无缝钢管切割-15crmog无缝钢管切割-40cr无缝钢管切割-42crmo无缝钢管切割-Q345B无缝钢管切割-45#无缝钢管切割 - 聊城宽达钢管有限公司 | 香蕉筛|直线|等厚|弧形|振动筛|香蕉筛厂家-洛阳隆中重工 | 常州企业采购平台_常州MRO采购公司_常州米孚机电设备有限公司 | 扒渣机厂家_扒渣机价格_矿用扒渣机_铣挖机_撬毛台车_襄阳永力通扒渣机公司 | 传动滚筒,改向滚筒-淄博建凯机械科技有限公司 | 钢格板|热镀锌钢格板|钢格栅板|钢格栅|格栅板-安平县昊泽丝网制品有限公司 | 扬州汇丰仪表有限公司| 排烟防火阀-消防排烟风机-正压送风口-厂家-价格-哪家好-德州鑫港旺通风设备有限公司 | 波纹补偿器_不锈钢波纹补偿器_巩义市润达管道设备制造有限公司 | 防渗土工膜|污水处理防渗膜|垃圾填埋场防渗膜-泰安佳路通工程材料有限公司 | 许昌奥仕达自动化设备有限公司 | 深圳3D打印服务-3D打印加工-手板模型加工厂-悟空打印坊 | 艾乐贝拉细胞研究中心 | 国家组织工程种子细胞库华南分库 | GEDORE扭力螺丝刀-GORDON防静电刷-CHEMTRONICS吸锡线-上海卓君电子有限公司 | 氧氮氢联合测定仪-联测仪-氧氮氢元素分析仪-江苏品彦光电 | 塑木弯曲试验机_铜带拉伸强度试验机_拉压力测试台-倾技百科 | 球磨机,节能球磨机价格,水泥球磨机厂家,粉煤灰球磨机-吉宏机械制造有限公司 | 超声波破碎仪-均质乳化机(供应杭州,上海,北京,广州,深圳,成都等地)-上海沪析实业有限公司 |