最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談為什么Mysql數據庫盡量避免NULL

 更新時間:2021年02月08日 14:23:27   作者:妖四靈.Shuen  
這篇文章主要介紹了淺談為什么Mysql數據庫盡量避免NULL,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

在Mysql中很多表都包含可為NULL(空值)的列,即使應用程序并不需要保存NULL也是如此,這是因為可為NULL是列的默認屬性。但我們常在一些Mysql性能優(yōu)化的書或者一些博客中看到觀點:在數據列中,盡量不要用NULL 值,使用0,-1或者其他特殊標識替換NULL值,除非真的需要存儲NULL值,那到底是為什么?如果替換了會有什么好處?同時又有什么問題呢?那么就看下面:

(1)如果查詢中包含可為NULL的列,對Mysql來說更難優(yōu)化,因為可為NULL的列使得索引,索引統(tǒng)計和值比較都更復雜。

(2)含NULL復合索引無效.

(3)可為NULL的列會使用更多的存儲空間,在Mysql中也需要特殊處理。

(4)當可為NULL的列被索引時,每個索引記錄需要一個額外的字節(jié),在MyISAM里甚至還可能導致固定大小的索引(例如只有一個整數列的索引)變成可變大小的索引。

理由佐證

理由1不需要佐證

首先新建環(huán)境, sql語句如下

create table nulltesttable(
id int primary key,
name_not_null varchar(10) not null,
name_null varchar(10)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
alter table nulltesttable add index idx_nulltesttable_name_not_null(name_not_null);
alter table nulltesttable add index idx_nulltesttable_name_null(name_null);

explain select * from nulltesttable where name_not_null='name'; // explain1
explain select * from nulltesttable where name_null='name'; // explain2

從sql 執(zhí)行可以看出, explain1中 key_len = 32, explain2中 key_len = 33
explain1的32 由來: 10(字段長度) * 3(utf8字符編碼占用長度) + 2(varchar標識為變長占用長度)
explain2的32 由來: 10(字段長度) * 3(utf8字符編碼占用長度) + 2(varchar標識為變長占用長度) + 1(null標識位占用長度)

兩個字符串拼接, 如果包含null值, 則返回結果為null.

insert into nulltesttable(id,name_not_null,name_null) values(1,'one',null);
insert into nulltesttable(id,name_not_null,name_null) values(2,'two','three');
select concat(name_not_null,name_null) from nulltesttable where id = 1; -- out: null
select concat(name_not_null,name_null) from nulltesttable where id = 2; -- out: twothree

如果字段允許null值, 且這個字段被索引. 如下的查詢可能會返回不正確的結果

select * from nulltesttable where name_null <> 'three' -- out: null
select count(name_null) from nulltesttable -- out: 1 

通常把可為NULL的列改為NOT NULL 帶來的性能提升比較小,所以(調優(yōu)時)沒有必要首先在現有schema中查找并修改掉這種情況,除非確定這會導致問題。但是,如果計劃在列上建索引,就應該盡量避免設計成可為NULL的列。

當確實需要標識未知值時也不要害怕使用NULL。在一些場景中,使用NULL可能會比某個神奇常數更好。從特定類型的值域中選擇一個不可能的值,例如用-1代表一個未知數,可能導致代碼復雜的多,并容易引入BUG,還可能讓事情變得一團糟(注:Mysql會在索引中存儲NULL值,Oracle不會)。

當然也有例外,InnoDB使用單獨的位(bit)來存儲NULL值,所以對于稀疏數據(很多值位NULL,只有少數行的列有非NULL值)由很好的空間效率,這一點不適用于MyISAM。

所以任何的設計和考慮請注意關注實際需求

到此這篇關于淺談為什么Mysql數據庫盡量避免NULL的文章就介紹到這了,更多相關Mysql避免NULL內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 解決Mysql:ERROR?1045?(28000):Access?denied?for?user?‘root‘@‘localhost‘?(using?password:?NO)的方法

    解決Mysql:ERROR?1045?(28000):Access?denied?for?user?‘roo

    最近在我們連接數據庫的時候遇到個問題,感覺還挺容易遇到的,所以總結下,這篇文章主要給大家介紹了關于解決Mysql:ERROR?1045?(28000):Access?denied?for?user?‘root‘@‘localhost‘?(using?password:?NO)的方法,需要的朋友可以參考下
    2022-06-06
  • 在JPA項目啟動時如何新增MySQL字段

    在JPA項目啟動時如何新增MySQL字段

    這篇文章主要介紹了在JPA項目啟動時新增MySQL字段,本來用了JPA,直接實體類加參數就可以新增字段了,但是架不住垃圾項目在啟動項目時會加載數據庫SQL文件去插入數據,需要一些操作幫助修復,需要的朋友可以參考下
    2024-06-06
  • MySQL數據庫服務器端核心參數詳解和推薦配置

    MySQL數據庫服務器端核心參數詳解和推薦配置

    MySQL手冊上也有服務器端參數的解釋,以及參數值的相關說明信息,現針對我們大家重點需要注意、需要修改或影響性能 的服務器端參數,作其用處的解釋和如何配置參數值的推薦,此事情拖了不少時間,為方便大家?guī)兔m錯
    2011-12-12
  • mysql8.0?my.ini?如何永久修改時區(qū)

    mysql8.0?my.ini?如何永久修改時區(qū)

    這篇文章主要介紹了mysql8.0?my.ini?如何永久修改時區(qū),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • MySQL中join語句怎么優(yōu)化

    MySQL中join語句怎么優(yōu)化

    本文主要介紹了MySQL中join語句怎么優(yōu)化,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03
  • Mysql 存在多條數據時如何按時間取最新的那一組數據(思路詳解)

    Mysql 存在多條數據時如何按時間取最新的那一組數據(思路詳解)

    這篇文章主要介紹了Mysql 存在多條數據時如何按時間取最新的那一組數據,本文給大家分享兩種思路結合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2024-04-04
  • MySQL開啟慢查詢方法及實例

    MySQL開啟慢查詢方法及實例

    這篇文章主要介紹了MySQL開啟慢查詢方法及實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04
  • 關于MYSQL的優(yōu)化全面詳解

    關于MYSQL的優(yōu)化全面詳解

    一直用了那么久的mysql,雖然了解了一些優(yōu)化方法,但是都是比較簡單的一些應用,這次就系統(tǒng)的了解一下
    2012-09-09
  • MySQL的查詢緩存和Buffer Pool

    MySQL的查詢緩存和Buffer Pool

    這篇文章主要介紹了MySQL的查詢緩存和Buffer Pool,幫助大家更好的理解和學習MySQL 數據庫,感興趣的朋友可以了解下
    2020-11-11
  • MySQL外鍵使用詳解

    MySQL外鍵使用詳解

    兩天有人問mysql中如何加外鍵,今天抽時間總結一下。mysql中MyISAM和InnoDB存儲引擎都支持外鍵(foreign key),但是MyISAM只能支持語法,卻不能實際使用。
    2015-03-03

最新評論

丰都县| 乐昌市| 阜阳市| 平凉市| 斗六市| 友谊县| 顺昌县| 阜平县| 慈溪市| 康保县| 仪陇县| 旺苍县| 花垣县| 临高县| 买车| 于田县| 平谷区| 新龙县| 丹东市| 万源市| 司法| 宁都县| 淳化县| 普格县| 扎赉特旗| 威远县| 吐鲁番市| 广灵县| 利辛县| 松潘县| 仪陇县| 镇雄县| 绵阳市| 孝昌县| 蒲城县| 临武县| 股票| 余江县| 洮南市| 常州市| 武威市|