小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

數(shù)據(jù)庫(kù)允許空值(null),往往是悲劇的開(kāi)始(1分鐘系列)

 timtxu 2019-08-25

數(shù)據(jù)庫(kù)字段允許空值,會(huì)遇到一些問(wèn)題,此處包含的一些知識(shí)點(diǎn),和大家聊一聊。

數(shù)據(jù)準(zhǔn)備:

create table user (

id int,

name varchar(20),

index(id)

)engine=innodb;

insert into user values(1,'shenjian');

insert into user values(2,'zhangsan');

insert into user values(3,'lisi');

說(shuō)明:

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

知識(shí)點(diǎn)1(熱身):負(fù)向查詢不能命中索引,會(huì)導(dǎo)致全表掃描。

數(shù)據(jù)庫(kù)允許空值(null),往往是悲劇的開(kāi)始(1分鐘系列)

explain select * from user where id!=1;

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

(1)type=ALL,全表掃描;

(2)rows=3,全表只有3行;

知識(shí)點(diǎn)2(劃重點(diǎn)):允許空值,不等于(!=)查詢,可能導(dǎo)致不符合預(yù)期的結(jié)果。

數(shù)據(jù)庫(kù)允許空值(null),往往是悲劇的開(kāi)始(1分鐘系列)

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

先構(gòu)造一條id為NULL的數(shù)據(jù),可以看到共有4條記錄。

select * from user where id!=1;

再次執(zhí)行不等于查詢。

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

答錯(cuò)了!

結(jié)果集只有2條記錄,空值記錄記錄并未出現(xiàn)在結(jié)果集里。

數(shù)據(jù)庫(kù)允許空值(null),往往是悲劇的開(kāi)始(1分鐘系列)

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

如果想到得到符合預(yù)期的結(jié)果集,必須加上一個(gè)or條件。

畫(huà)外音:惡心不惡心,這個(gè)大坑你踩過(guò)沒(méi)有?

知識(shí)點(diǎn)3(附加):某些or條件,又可能導(dǎo)致全表掃描,此時(shí)應(yīng)該優(yōu)化為union。

數(shù)據(jù)庫(kù)允許空值(null),往往是悲劇的開(kāi)始(1分鐘系列)

explain select * from user where id=1;

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

(1)type=ref,走非唯一索引;

(2)rows=1,預(yù)估掃描1行;

數(shù)據(jù)庫(kù)允許空值(null),往往是悲劇的開(kāi)始(1分鐘系列)

explain select * from user where id is null;

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

(1)type=ref,走非唯一索引;

(2)rows=1,預(yù)估掃描1行;

數(shù)據(jù)庫(kù)允許空值(null),往往是悲劇的開(kāi)始(1分鐘系列)

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

如果放到一個(gè)SQL語(yǔ)句里用or查詢,則會(huì)全表掃描,如上圖所示:

(1)type=ALL,全表掃描;

(2)rows=4,全表只有4行;

數(shù)據(jù)庫(kù)允許空值(null),往往是悲劇的開(kāi)始(1分鐘系列)

explain select * from user where id=1

union

select * from user where id is null;

此時(shí)應(yīng)該優(yōu)化為union查詢,又能夠命中索引了,如上圖所示:

(1)type=ref,走非唯一索引;

(2)rows=1,預(yù)估掃描1行;

畫(huà)外音:第三行臨時(shí)表的ALL,是兩次結(jié)果集的合并。

總結(jié)

(1)負(fù)向比較(例如:!=)會(huì)引發(fā)全表掃描

(2)如果允許空值,不等于(!=)的查詢,不會(huì)將空值行(row)包含進(jìn)來(lái),此時(shí)的結(jié)果集往往是不符合預(yù)期的,此時(shí)往往要加上一個(gè)or條件,把空值(is null)結(jié)果包含進(jìn)來(lái);

(3)or可能會(huì)導(dǎo)致全表掃描,此時(shí)可以優(yōu)化為union查詢;

(4)建表時(shí)加上默認(rèn)(default)值,這樣能避免空值的坑;

(5)explain工具是一個(gè)好東西;

希望大家有收獲!

畫(huà)外音:本文測(cè)試于MySQL5.6。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多