成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

數據庫允許空值(null),往往是悲劇的開始(1分鐘系列)

開發 開發工具
數據庫字段允許空值,會遇到一些問題,此處包含的一些知識點,和大家聊一聊。

數據庫字段允許空值,會遇到一些問題,此處包含的一些知識點,和大家聊一聊。

數據準備:

  1. create table user ( 
  2. id int, 
  3. name varchar(20), 
  4. index(id) 
  5. )engine=innodb
  6.   
  7. insert into user values(1,'shenjian'); 
  8. insert into user values(2,'zhangsan'); 
  9. insert into user values(3,'lisi'); 

說明:id為索引,非唯一(non unique),允許空(null)。

知識點1(熱身):負向查詢不能命中索引,會導致全表掃描。

  1. explain select * from user where id!=1; 

索引字段id上的不等于查詢,如上圖所示:

  • type=ALL,全表掃描;
  • rows=3,全表只有3行;

知識點2(劃重點):允許空值,不等于(!=)查詢,可能導致不符合預期的結果。

  1. insert into user(name) values('wangwu'); 

先構造一條id為NULL的數據,可以看到共有4條記錄。

  1. select * from user where id!=1; 

再次執行不等于查詢。

你猜結果集有幾條記錄(共4條,不等于排除1條)?

答錯了!

結果集只有2條記錄,空值記錄記錄并未出現在結果集里。

  1. select * from user where id!=1 or id is null; 

如果想到得到符合預期的結果集,必須加上一個or條件。

畫外音:惡心不惡心,這個大坑你踩過沒有?

知識點3(附加):某些or條件,又可能導致全表掃描,此時應該優化為union。

  1. explain select * from user where id=1

索引字段id上的等值查詢,能命中索引,如上圖所示:

  • type=ref,走非唯一索引;
  • rows=1,預估掃描1行;

  1. explain select * from user where id is null; 

索引字段id上的null查詢,也能命中索引,如上圖所示:

  • type=ref,走非唯一索引;
  • rows=1,預估掃描1行;

  1. explain select * from user where id=1 or id is null; 

如果放到一個SQL語句里用or查詢,則會全表掃描,如上圖所示:

  • type=ALL,全表掃描;
  • rows=4,全表只有4行;

  1. explain select * from user where id=1  
  2. union 
  3. select * from user where id is null; 

此時應該優化為union查詢,又能夠命中索引了,如上圖所示:

  • type=ref,走非唯一索引;
  • rows=1,預估掃描1行;

畫外音:第三行臨時表的ALL,是兩次結果集的合并。

總結

  • 負向比較(例如:!=)會引發全表掃描;
  • 如果允許空值,不等于(!=)的查詢,不會將空值行(row)包含進來,此時的結果集往往是不符合預期的,此時往往要加上一個or條件,把空值(is null)結果包含進來;
  • or可能會導致全表掃描,此時可以優化為union查詢;
  • 建表時加上默認(default)值,這樣能避免空值的坑;
  • explain工具是一個好東西;

希望大家有收獲!

畫外音:本文測試于MySQL5.6。

【本文為51CTO專欄作者“58沈劍”原創稿件,轉載請聯系原作者】

戳這里,看該作者更多好文

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

2020-05-26 10:42:31

數據庫讀寫分離數據庫架構

2019-08-07 07:04:54

內存緩存數據庫KV

2009-11-02 18:07:58

Oracle數據庫

2009-11-20 18:08:37

Oracle數據庫

2018-06-26 09:37:07

時序數據庫FacebookNoSQL

2019-11-20 10:38:59

MySQLSQL數據庫

2018-03-12 21:31:24

區塊鏈

2009-11-20 17:06:49

Oracle數據庫字符

2020-07-21 07:42:29

數據庫信息技術

2023-04-15 20:33:35

圖形數據庫數據庫

2025-02-25 07:49:36

智能體數據庫DeepSeek

2024-12-04 16:12:31

2016-12-21 15:08:14

數據庫垂直拆分

2010-05-31 15:23:02

MySQL數據庫NUL

2019-07-28 20:49:37

回表查詢索引覆蓋MySQL

2022-03-04 16:06:33

數據庫HarmonyOS鴻蒙

2023-07-30 10:09:36

MMD數據庫

2018-03-12 14:37:50

區塊鏈比特幣架構

2019-07-24 07:05:51

CPU進程ID端口

2015-11-23 17:34:33

秒借
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产不卡一区在线观看 | 精精精精xxxx免费视频 | 一区二区三区欧美 | 日韩欧美在线观看 | 亚洲欧美国产精品久久 | 国产一区二区免费 | 中文字幕一区二区三区精彩视频 | 2018国产大陆天天弄 | 久久狼人天堂 | 国产精品99 | 狠狠操狠狠干 | 久久看看| 国产精品海角社区在线观看 | 中国毛片免费 | 欧美v片| 久久精彩视频 | 久久久久久天堂 | 中文字幕乱码一区二区三区 | 精品国产区 | 久久久久久久久久久丰满 | 亚洲va欧美va天堂v国产综合 | 亚洲夜射 | 成年人精品视频在线观看 | 日本成人在线观看网站 | 日韩一级不卡 | 久久综合影院 | 羞羞的视频免费看 | 久久久久9999 | 金莲网 | 中文字幕免费中文 | 日韩av一区二区在线观看 | 久久久久一区二区三区四区 | 一区二区三区免费 | 精品亚洲一区二区三区 | 日本不卡高字幕在线2019 | 最近日韩中文字幕 | 亚洲精品一区二区三区中文字幕 | 亚洲精品免费在线观看 | 欧美日韩专区 | 国产成人精品一区二区三区四区 | 日本高清不卡视频 |