亚洲免费在线视频-亚洲啊v-久久免费精品视频-国产精品va-看片地址-成人在线视频网

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

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

瀏覽:5日期: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難以優化引用可空列查詢,它會使索引、索引統計和值更加復雜??煽樟行枰嗟拇鎯臻g,還需要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 數據庫
相關文章:
主站蜘蛛池模板: 毛片高清一区二区三区 | 亚洲 欧美 手机 在线观看 | 久久久久久亚洲精品 | 久久一区二区三区免费播放 | 手机看片高清国产日韩片 | 国内自拍视频在线看免费观看 | 青青视频国产依人在线 | 看成年女人免费午夜视频 | 韩国一级免费视频 | 久久不见久久见免费影院www日本 | 国产或人精品日本亚洲77美色 | 日韩色吧| 免费观看a级毛片在线播放 免费观看a级网站 | 久久国产视屏 | 中文字幕在线永久 | 最刺激黄a大片免费观看下截 | 国产成人亚洲综合网站不卡 | 免费一级毛片在线播放视频 | 在线观看免费a∨网站 | 久久国产精品永久免费网站 | 黄色欧美网站 | 午夜免费理论片a级 | 91年精品国产福利线观看久久 | 欧美一级大黄特黄毛片视频 | 亚洲欧美综合一区二区三区四区 | 欧美日韩亚洲综合久久久 | 精品免费国产一区二区三区 | 欧美色视频在线观看 | 久久久久久中文字幕 | 爽爽爽爽爽爽a成人免费视频 | 失禁h啪肉尿出来高h | 亚洲欧美国产18 | 日本美女黄色一级片 | 在线国产二区 | 九九99香蕉在线视频网站 | 综合色久| 日韩视频精品在线 | 亚欧美图片自偷自拍另类 | 91丨九色丨首页在线观看 | 欧美成人xxxx| 国产偷自拍 |