欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2021年07月27日 14:54:34   作者:balfish  
這篇文章主要介紹了mysql 字段定義不要用null的原因分析,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

一 NULL 為什么這么經(jīng)常用

(1) java的null

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

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

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

guava的Optional

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

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

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

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

(c) 圖省事 null在開發(fā)中不用判斷插入數(shù)據(jù),寫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難以優(yōu)化引用可空列查詢,它會使索引、索引統(tǒng)計和值更加復雜??煽樟行枰嗟拇鎯臻g,還需要mysql內(nèi)部進行特殊處理。可空列被索引后,每條記錄都需要一個額外的字節(jié),還能導致MYisam 中固定大小的索引變成可變大小的索引。 —— 出自《高性能mysql第二版》

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

三 mysql不用null的理由

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

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

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

(4)NOT IN、!= 等負向條件查詢在有 NULL 值的情況下返回永遠為空結(jié)果,查詢?nèi)菀壮鲥e

四 null引發(fā)的bad case

數(shù)據(jù)初始化:

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值的情況下返回永遠為空結(jié)果,查詢?nèi)菀壮鲥e

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

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

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

select * from table2 where name != 'zhaoyun'

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

select * from table2 where name != 'zhaoyun1'

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

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

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

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

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

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 的計算規(guī)則和三個因素有關(guān):數(shù)據(jù)類型、字符編碼、是否為 NULL

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

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

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

到此這篇關(guān)于mysql 字段定義不要用null的分析的文章就介紹到這了,更多相關(guān)mysql 字段定義null內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL導出數(shù)據(jù)遇到secure-file-priv問題的解決方法

    MySQL導出數(shù)據(jù)遇到secure-file-priv問題的解決方法

    這篇文章主要為大家詳細介紹了MySQL導出數(shù)據(jù)遇到secure-file-priv問題的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • 關(guān)于MySQL中explain工具的使用

    關(guān)于MySQL中explain工具的使用

    這篇文章主要介紹了關(guān)于MySQL中explain工具的使用,在select語句之前增加explain關(guān)鍵字,MySQL會在查詢上設置一個標記,執(zhí)行查詢會返回執(zhí)行計劃的信息,而不是執(zhí)行這條SQL,需要的朋友可以參考下
    2023-05-05
  • Mysql中關(guān)于Incorrect string value的解決方案

    Mysql中關(guān)于Incorrect string value的解決方案

    在對mysql數(shù)據(jù)庫中插入數(shù)據(jù)的時候,直接插入中文是沒有問題的!但是用預編譯語句時,用流對數(shù)據(jù)進行處理總報incorrect string value這個異常。本篇文章教給你解決方法
    2021-09-09
  • mysql中的臨時表如何使用

    mysql中的臨時表如何使用

    這篇文章主要介紹了mysql中的臨時表如何使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • MySQL實現(xiàn)顯示百分比顯示和前百分之幾的方法

    MySQL實現(xiàn)顯示百分比顯示和前百分之幾的方法

    這篇文章主要介紹了MySQL中如何顯示百分比和顯示前百分之幾的,文中的示例代碼講解詳細,對我們學習MySQL有一定的幫助,感興趣的小伙伴可以了解一下
    2021-12-12
  • mysql 索引的基礎操作匯總(四)

    mysql 索引的基礎操作匯總(四)

    這篇文章主要為大家詳細介紹了mysql 索引的基礎操作匯總,涵蓋了創(chuàng)建和查看索引、刪除索引等操作,感興趣的小伙伴們可以參考一下
    2016-08-08
  • php下巧用select語句實現(xiàn)mysql分頁查詢

    php下巧用select語句實現(xiàn)mysql分頁查詢

    mysql分頁查詢是我們經(jīng)常見到的問題,那么應該如何實現(xiàn)呢?下面就教您一個實現(xiàn)mysql分頁查詢的好方法,供您參考學習。
    2010-12-12
  • MySQL恢復中的幾個問題解決方法

    MySQL恢復中的幾個問題解決方法

    這篇文章主要介紹了MySQL恢復中的幾個問題,需要的朋友可以參考下
    2016-01-01
  • mysql?sql_mode數(shù)據(jù)驗證檢查方法

    mysql?sql_mode數(shù)據(jù)驗證檢查方法

    sql_mode?會影響MySQL支持的sql語法以及執(zhí)行的數(shù)據(jù)驗證檢查,通過設置sql_mode?,可以完成不同嚴格程度的數(shù)據(jù)校驗,有效地保障數(shù)據(jù)準確性,這篇文章主要介紹了mysql?sql_mode數(shù)據(jù)驗證檢查,需要的朋友可以參考下
    2023-08-08
  • MySQL游標的使用方式

    MySQL游標的使用方式

    這篇文章主要介紹了MySQL游標的使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01

最新評論