日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

mysql IS NULL使用索引案例講解

瀏覽:31日期:2023-10-26 13:10:28
簡介

mysql的sql查詢語句中使用is null、is not null、!=對索引并沒有任何影響,并不會因為where條件中使用了is null、is not null、!=這些判斷條件導致索引失效而全表掃描。

mysql官方文檔也已經明確說明is null并不會影響索引的使用。

MySQL can perform the same optimization on col_name IS NULL that it can use for col_name = constant_value. For example, MySQL can use indexes and ranges to search for NULL with IS NULL.

事實上,導致索引失效而全表掃描的通常是因為一次查詢中回表數量太多。mysql計算認為使用索引的時間成本高于全表掃描,于是mysql寧可全表掃描也不愿意使用索引。

案例

CREATE TABLE `user_info` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(11) DEFAULT NULL, `age` int(4) DEFAULT NULL, PRIMARY KEY (`id`), KEY `index_name` (`name`) USING BTREE) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO `user_info` (`id`, `name`, `age`) VALUES (’1’, ’tom’, ’18’);INSERT INTO `user_info` (`id`, `name`, `age`) VALUES (’2’, null, ’19’);INSERT INTO `user_info` (`id`, `name`, `age`) VALUES (’3’, ’cat’, ’20’);

執行sql查詢時使用is null、is not null,發現依然使用的索引查詢,并沒有出現索引失效的問題。

mysql IS NULL使用索引案例講解

mysql IS NULL使用索引案例講解

分析

分析上述現象,則需要詳細了解mysql索引的工作原理以及索引數據結構。下面,分別通過工具解析和直接查看二進制文件兩種方式分別分析mysql索引數據結構。

工具解析

innodb_ruby是一個非常強大的mysql分析工具,可以用來輕松解析mysql的.ibd文件進而深入理解mysql的數據結構。

首先安裝innodb_ruby工具:

yum install -y rubygems ruby-devegem install innodb_ruby

innodb_ruby的功能很多,此處我們只需要用來解析mysql的索引結構,因此只需要如下的命令即可。更多的功能和命令詳見wiki。

innodb_space -s ibdata1 -T sakila/film -I PRIMARY index-recurse

解析主鍵索引:

$ innodb_space -s /usr/soft/mysql-5.6.31/data -T test/user_info -I PRIMARY index-recurseROOT NODE #3: 3 records, 89 bytes RECORD: (id=1) → (name='tom', age=18) RECORD: (id=2) → (name=:NULL, age=19) RECORD: (id=3) → (name='cat', age=20)

解析普通索引index_name:

$ innodb_space -s /usr/soft/mysql-5.6.31/data -T test/user_info -I index_name index-recurseROOT NODE #4: 3 records, 38 bytes RECORD: (name=:NULL) → (id=2) RECORD: (name='cat') → (id=3) RECORD: (name='tom') → (id=1)

通過解析工具數據mysql的索引結構可以發現,null值也被儲存到了索引樹中,并且null值被處理成最小的值放在index_name索引樹的最左側。

二進制文件

找到user_info表對應的物理文件user_info.ibd,通過軟件例如UltraEdit打開,直接定位到第5個數據頁(mysql默認一個數據頁占用16KB)。

mysql IS NULL使用索引案例講解

如圖,這些二進制數據就是index_name索引對應的索引頁數據,只挑選其中的索引記錄,展開如下:

最小記錄0x00010063

01 B2 01 00 02 00 29 記錄頭信息69 6E 66 69 6D 75 6D 最小記錄(固定值infimum)

最大記錄0x00010070

00 04 00 0B 00 00 記錄頭信息73 75 70 72 65 6D 75 6D 最大記錄(固定值supremum)

ID為1的索引0x0001007f

03 00 00 00 10 FF F1 記錄頭信息74 6F 6D 字段name的值:tom80 00 00 01 RowID:主鍵id的值為1

ID為2的索引0x0001008c

01 00 00 18 00 0B 記錄頭信息字段name的值:null80 00 00 02RowID:主鍵id的值為2

ID為3的索引0x00010097

03 00 00 00 20 FF E8 記錄頭信息63 61 74 字段name的值:cat80 00 00 03 RowID:主鍵id的值為3

最小記錄的記錄頭信息最后2字節00 29 -> 0x00010063偏移0x0029 -> 0x0001008C,即ID為2的索引位置;

ID為2的記錄頭信息最后2字節00 0B -> 0x0001008C偏移0x000B -> 0x00010097,即ID為3的索引位置;

ID為3的記錄頭信息最后2字節FF E8 -> 0x00010097偏移0xFFE8 -> 0x0001007F,即ID為1的索引位置;

ID為1的記錄頭信息最后2字節FF F1 -> 0x0001007F偏移0xFFF1 -> 0x00010070,最大記錄的記錄位置;

由此可見索引記錄是通過單向鏈表并以索引值排序串聯在一起,而null值被處理成最小的值放在了索引鏈表的最開始位置,也就是索引樹的最左側。與innodb_ruby工具解析出來的結果一致。

誤解原因

為何大眾誤解認為is null、is not null、!=這些判斷條件會導致索引失效而全表掃描呢?

導致索引失效而全表掃描的通常是因為一次查詢中回表數量太多。mysql計算認為使用索引的時間成本高于全表掃描,于是mysql寧可全表掃描也不愿意使用索引。使用索引的時間成本高于全表掃描的臨界值可以簡單得記憶為20%左右。

詳細的分析過程可以見筆者的另一篇博客:mysql回表致索引失效。

也就是如果一條查詢語句導致的回表范圍超過全部記錄的20%,則會出現索引失效的問題。而is null、is not null、!=這些判斷條件經常會出現在這些回表范圍很大的場景,然后被人誤解為是這些判斷條件導致的索引失效。

復現索引失效

復現索引失效,只需要回表范圍超過全部記錄的20%,如下插入1000條非null記錄。

delimiter //CREATE PROCEDURE init_user_info() BEGIN DECLARE indexNo INT;SET indexNo = 0;WHILE indexNo < 1000 DOSTART TRANSACTION; insert into user_info(name,age) values (concat(floor(rand()*1000000000)),floor(rand()*100));SET indexNo = indexNo + 1;COMMIT; END WHILE;END //delimiter ;call init_user_info();

此時user_info表中一共有1003條記錄,其中只有1條記錄的name值為null。那么is null判斷語句導致的回表記錄只有1/1003不會超過臨界值,而is not null判斷語句導致的回表記錄有1002/1003遠遠超過臨界值,將出現索引失效的現象。

由下兩圖也可以見,is null依然正常使用索引,而is not null如預期由于回表率太高而寧可全表掃描也不使用索引。

mysql IS NULL使用索引案例講解

mysql IS NULL使用索引案例講解

使用mysql的optimizer tracing(mysql5.6版本開始支持)功能來分析sql的執行計劃:

SET optimizer_trace='enabled=on';explain select * from user_info where name is not null;SELECT * FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;

optimizer tracing輸出的執行計劃可見,該查詢下,使用全表掃描所需要的時間成本為206.9;而使用索引所需要的時間成本為1203.4,遠遠高于全表掃描。因此mysql最終選擇全表掃描而出現索引失效的現象。

{ 'rows_estimation': [{ 'table': '`user_info`', 'range_analysis': {'table_scan': { 'rows': 1004, // 全表掃描需要掃描1004條記錄 'cost': 206.9 // 全表掃描需要的成本為206.9},'potential_range_indices': [ {'index': 'PRIMARY','usable': false,'cause': 'not_applicable' }, {'index': 'index_name','usable': true,'key_parts': [ 'name', 'id'] }],'setup_range_conditions': [],'group_index_range': { 'chosen': false, 'cause': 'not_group_by_or_distinct'},'analyzing_range_alternatives': { 'range_scan_alternatives': [{ 'index': 'index_name', 'ranges': ['NULL < name' ], 'index_dives_for_eq_ranges': true, 'rowid_ordered': false, 'using_mrr': false, 'index_only': false, 'rows': 1002, // 索引需要掃描1002條記錄 'cost': 1203.4, // 索引需要的成本為1203.4 'chosen': false, 'cause': 'cost'} ], 'analyzing_roworder_intersect': {'usable': false,'cause': 'too_few_roworder_scans' }} }} ]}

到此這篇關于mysql IS NULL使用索引案例講解的文章就介紹到這了,更多相關mysql IS NULL使用內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: MySQL 數據庫
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
石原莉奈在线亚洲三区| 成人精品视频| 精品视频91| 吉吉日韩欧美| 激情欧美国产欧美| 91久久久久| 中文字幕av一区二区三区人| 亚洲激情社区| 欧美精品一二| 五月亚洲婷婷 | 蜜桃av在线播放| av不卡在线| 91亚洲精品在看在线观看高清| 欧美日韩中文| 免费一级欧美在线观看视频| 国产成人精品亚洲日本在线观看| 国产一区成人| 伊人精品在线| 蜜桃视频一区二区| 日韩欧乱色一区二区三区在线| 成人在线免费观看91| 91成人超碰| 亚洲一区亚洲| 欧美日一区二区在线观看| 日韩av一区二区三区| 国产精品一卡| 亚洲一区亚洲| 四虎精品一区二区免费| 国产精品男女| 99日韩精品| 亚洲综合日韩| 91嫩草精品| 中文字幕人成乱码在线观看| 亚洲午夜一级| 婷婷精品在线| 91欧美在线| 性一交一乱一区二区洋洋av| 日韩和欧美的一区| 98精品久久久久久久| 99在线精品免费视频九九视| 国产午夜一区| 日韩高清不卡| 亚洲毛片网站| 国产91在线精品| 亚洲激情久久| 国产日韩亚洲欧美精品| 蜜臀国产一区| 亚洲影视一区| 国产白浆在线免费观看| 鲁大师成人一区二区三区| 国产伦精品一区二区三区在线播放| 麻豆视频一区二区| 激情五月综合| 久久爱www.| 日韩高清中文字幕一区二区| 日韩专区欧美专区| 欧美1区二区| 亚洲中字黄色| 成人精品动漫一区二区三区| 午夜久久免费观看| 久久99青青| 99国产精品99久久久久久粉嫩| 国产精品观看| 日韩一区二区久久| 精品美女在线视频| 视频一区二区欧美| av最新在线| 久久国产免费| 国产伦精品一区二区三区视频| 91欧美在线| 麻豆91小视频| 欧美亚洲tv| 欧美性www| 青青草91视频| 久久久国产精品网站| а√在线中文在线新版| 樱桃视频成人在线观看| 国产精品115| 国产无遮挡裸体免费久久| 日韩欧美一区二区三区免费观看| 久久99久久久精品欧美| 国精品产品一区| 久久人人99| 国产精品色网| 国产精品最新自拍| 99国产精品视频免费观看一公开 | 狠狠色狠狠色综合日日tαg| 国产精品视频一区视频二区| 国产精品88久久久久久| 风间由美中文字幕在线看视频国产欧美| 夜夜嗨av一区二区三区网站四季av| 美女视频黄 久久| 亚洲三级观看| 亚洲精华国产欧美| 啪啪国产精品| 国产精品香蕉| 四虎精品永久免费| 国产精品毛片在线| 今天的高清视频免费播放成人| 久久一区精品| 亚洲人成毛片在线播放女女| 亚洲国产影院| 亚洲日本网址| 高清一区二区| 欧美国产视频| 国产精品蜜月aⅴ在线| 日韩一区二区三免费高清在线观看| 91久久中文| 亚洲韩日在线| 国产高清不卡| 国产一区二区三区日韩精品| 欧美午夜三级| 日韩1区2区日韩1区2区| 亚洲欧美日本国产专区一区| 性欧美69xoxoxoxo| 婷婷综合六月| 国产成人免费精品| 国产一区二区三区久久| 另类欧美日韩国产在线| 欧美三区不卡| 91精品一区| 欧美日韩a区| 欧美日韩99| 国产欧美久久一区二区三区| 日韩一二三区在线观看| 亚洲精选91| 四虎成人精品一区二区免费网站| 在线国产日韩| 日韩精品91亚洲二区在线观看| 日韩在线网址| 日韩国产欧美一区二区三区| 久久国产88| 男女激情视频一区| 亚洲精品在线a| 亚洲+小说+欧美+激情+另类| 日韩精品视频中文字幕| 日本不卡一区二区三区| 国产精品免费精品自在线观看| 欧美日韩在线精品一区二区三区激情综合| 日本成人中文字幕| 欧美日韩中文| 久久精品九色| 欧美日韩国产观看视频| 国产 日韩 欧美一区| 欧美福利一区| 久久亚洲美女| 石原莉奈在线亚洲三区| 中文精品电影| 久久国内精品视频| 精品国产中文字幕第一页| 精品免费视频| 激情欧美一区二区三区| 男女激情视频一区| 国产精品探花在线观看| 欧美国产一级| 91成人网在线观看| 亚洲ww精品| 精品久久一区| 久久美女性网| 在线精品福利| 国产精品22p| 日韩电影免费网站| 精品一区亚洲| 中文字幕亚洲影视| 久久99久久久精品欧美| 欧美成人精品三级网站| 丝袜美腿高跟呻吟高潮一区| 911精品国产| 日韩国产激情| 水野朝阳av一区二区三区| 国产日产精品_国产精品毛片| 日韩88av| 视频一区中文字幕| 欧美黑人巨大videos精品| 欧美日韩精品在线一区| 丝袜美腿成人在线| 国产精品毛片视频| 欧美日韩精品在线一区| 91九色综合| 日韩天堂在线| 亚洲免费毛片| 高清日韩中文字幕| 视频一区中文字幕国产| 精品中国亚洲| 国产精品婷婷| 久久精品国产网站| 夜久久久久久| 久久久久伊人| 丝袜美腿亚洲一区二区图片| 动漫av一区| 亚洲午夜国产成人| 久久av电影| 日韩精品一区第一页| 91欧美国产| 亚洲精品乱码日韩| 色天使综合视频| 久久国产人妖系列| 欧美日韩国产在线一区| 久久精品国产免费| 中文字幕一区二区av|