电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

淺析MysQL B-Tree 索引

瀏覽:4日期:2023-10-09 07:40:43

B-Tree 索引

不同的存儲引擎也可能使用不同的存儲結(jié)構(gòu),i如,NDB集群存儲引擎內(nèi)部實(shí)現(xiàn)使用了T-Tree結(jié)構(gòu)存儲這種索引,即使其名字是BTREE;InnoDB使用的是B+Tree。

B-Tree通常一位這所有的值都是按順序存儲的,并且每一個葉子頁道根的距離相同。下圖大致反應(yīng)了InnoDB索引是如何工作的。

淺析MysQL B-Tree 索引

為什么mysql索引要使用B+樹,而不是B樹,紅黑樹

看完上面的文章就可以理解為何B-Tree索引能夠快速訪問數(shù)據(jù)了。因?yàn)榇鎯σ娌辉傩枰M(jìn)行全表掃描獲取需要的數(shù)據(jù),葉子節(jié)點(diǎn)包含了所有元素信息,每一個葉子節(jié)點(diǎn)指針都指向下一個節(jié)點(diǎn),所以很適合查找范圍數(shù)據(jù)。

索引對多個值進(jìn)行排列的依據(jù)是CREATE TABLE 語句中定義索引時的順序。

那么,索引排序的規(guī)則就是按照 last_name ,first_name ,dob 的順序來的。

可以使用 B-Tree 索引的查詢類型B-Tree索引適用于全鍵值、鍵值范圍或鍵前綴查找。鍵前綴查找只是用于根據(jù)最左前綴查找。

舉個粒子:

CREATE TABLE People ( last_name VARCHAR ( 50 ) NOT NULL, first_name VARCHAR ( 50 ) NOT NULL, dob date NOT NULL, gender enum ( ’m’, ’f’ ) NOT NULL,KEY ( last_name, first_name, dob ) );

這個表的索引如下:

淺析MysQL B-Tree 索引

type結(jié)果

type結(jié)果值從好到壞依次是:

system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

一般來說,得保證查詢至少達(dá)到range級別,最好能達(dá)到ref,否則就可能會出現(xiàn)性能問題。

possible_keys:sql所用到的索引

key:顯示MySQL實(shí)際決定使用的鍵(索引)。如果沒有選擇索引,鍵是NULL

(1)全值匹配全值匹配指的是和索引中的所有列進(jìn)行匹配。

例如上面的People表的索引(last_name,first_name,dob)可以用于查找last_name=’Cuba Allen’,first_name=’Chuang’,dob=’1996-01-01’的人。這就是使用了索引中的所有列進(jìn)行匹配,即全值匹配。

mysql> EXPLAIN select * from People where last_name = ’aaa’ and first_name = ’bbb’ and dob=’2020-11-20’ G;*************************** 1. row *************************** id: 1 select_type: SIMPLE table: People partitions: NULL type: refpossible_keys: last_name key: last_name <-----可以看到這個key就是我們定義的索引 key_len: 307 ref: const,const,const rows: 1 filtered: 100.00 Extra: NULL1 row in set, 1 warning (0.00 sec)ERROR: No query specified

(2)匹配最左前綴可以只使用索引的第一個列進(jìn)行匹配。

例如可以用于查找last_name=’aaa’的人,即用于查找姓為Zeng的人,這里只使用了索引的最左列進(jìn)行匹配,即匹配最左前綴。

mysql> EXPLAIN select * from People where last_name = ’aaa’ G;*************************** 1. row *************************** id: 1 select_type: SIMPLE table: People partitions: NULL type: refpossible_keys: last_name key: last_name <----使用了索引 key_len: 152 ref: const rows: 3 filtered: 100.00 Extra: NULL1 row in set, 1 warning (0.00 sec)ERROR: No query specified

(3)匹配列前綴可以只匹配某一列的值的開頭部分。

例如可以用于查找last_name LIKE ‘a(chǎn)%’的人,即用于查找所有以Z開頭的姓的人,這里只使用了索引最左列的前綴進(jìn)行匹配,即匹配列前綴。

mysql> EXPLAIN select * from People where last_name = ’a%’ G;*************************** 1. row *************************** id: 1 select_type: SIMPLE table: People partitions: NULL type: refpossible_keys: last_name key: last_name <---使用了索引 key_len: 152 ref: const rows: 1 filtered: 100.00 Extra: NULL1 row in set, 1 warning (0.00 sec)ERROR: No query specified

(4)匹配范圍值可以只適用索引的第一列查找符合某個范圍內(nèi)的數(shù)據(jù)。

例如可以用于查找last_name BETWEEN ‘a(chǎn)aa’ AND ‘a(chǎn)aabbbccc’的人,即用于查找姓在aaa和aaabbbccc之間的人,這里只使用了索引最左列的前綴進(jìn)行范圍匹配,即匹配范圍值。

mysql> EXPLAIN select * from People where last_name BETWEEN ’aaa’ and ’aaabbbccc’G;*************************** 1. row *************************** id: 1 select_type: SIMPLE table: People partitions: NULL type: rangepossible_keys: last_name key: last_name <---使用了索引 key_len: 152 ref: NULL rows: 3 filtered: 100.00 Extra: Using index condition1 row in set, 1 warning (0.00 sec)ERROR: No query specified

(5)精確匹配某一列并范圍匹配另外一列可以使第一列全匹配,第二列范圍匹配。

例如可以用于查找last_name=’aaa’ AND first_name LIKE ’b%’的人,即用于查找姓是Zeng,名字以C開頭的人,這里使用了索引的最左列精確匹配,第二列進(jìn)行范圍匹配。

mysql> EXPLAIN select * from People where last_name = ’aaa’ and first_name like ’b%’G;*************************** 1. row *************************** id: 1 select_type: SIMPLE table: People partitions: NULL type: rangepossible_keys: last_name key: last_name <---使用了索引 key_len: 304 ref: NULL rows: 1 filtered: 100.00 Extra: Using index condition1 row in set, 1 warning (0.00 sec)ERROR: No query specified

(6)只訪問索引的查詢查詢只需訪問索引,而無須訪問數(shù)據(jù)行。

例如select last_name, first_name where last_name=’aaa’; 這里只查詢索引所包含的last_name和first_name列,則無須讀取數(shù)據(jù)行。

mysql> explain select last_name,first_name,dob from People where last_name = ’aaa’*************************** 1. row *************************** id: 1 select_type: SIMPLE table: People partitions: NULL type: refpossible_keys: last_name key: last_name key_len: 152 ref: const rows: 1 filtered: 100.00 Extra: Using index1 row in set, 1 warning (0.00 sec)ERROR: No query specified

B-Tree 的限制

(1)只能按照索引的最左列開始查找。例如People表中的索引無法用于查找first_name為’bbb’的人,也無法查找某個特定生日的人,因?yàn)檫@兩個列都不是最左數(shù)據(jù)列。

(2)只能按照索引最左列的最左前綴進(jìn)行匹配。例如People表中的索引無法查找last_name LIKE ‘%b’的人,雖然last_name就是此索引的最左列,但MySQL索引無法查找以‘b’結(jié)尾的last_name的記錄。

(3)只能按照索引定義的順序從左到右進(jìn)行匹配,不能跳過索引中的列。例如People表中的索引無法用于查找last_name=’a’ AND bod=’1996-01-01’的人,因?yàn)镸ySQL無法跳過索引中的某一列而使用索引中最左列和排在末尾的列進(jìn)行組合。如果不指定索引中中間的列,則MySQL只能使用索引的最左列,即第一列。

(4)如果查詢中有某個列的范圍查詢,則其右邊所有列都無法使用索引優(yōu)化查找。例如有這樣一個查詢:where last_name=’a’ AND first_name LIKE ’b%’ AND dob=’1996-01-01’; 這個查詢只能使用索引的前兩列,因?yàn)檫@里L(fēng)IKE是一個范圍條件,則first_name后面的索引列都將失效。(優(yōu)化點(diǎn):盡量不要在索引列中使用LIKE等范圍條件,改用多個等于條件來替代,保證后面的索引列能生效。)

以上就是淺析MysQL B-Tree 索引的詳細(xì)內(nèi)容,更多關(guān)于MysQL B-Tree 索引的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: MySQL 數(shù)據(jù)庫
相關(guān)文章:
主站蜘蛛池模板: 高光谱相机-近红外高光谱相机厂家-高光谱成像仪-SINESPEC 赛斯拜克 | 安平县鑫川金属丝网制品有限公司,防风抑尘网,单峰防风抑尘,不锈钢防风抑尘网,铝板防风抑尘网,镀铝锌防风抑尘网 | 湖南档案密集架,智能,物证,移动,价格-湖南档案密集架厂家 | 吸污车_吸粪车_抽粪车_电动三轮吸粪车_真空吸污车_高压清洗吸污车-远大汽车制造有限公司 | 液压压力机,液压折弯机,液压剪板机,模锻液压机-鲁南新力机床有限公司 | 上海乾拓贸易有限公司-日本SMC电磁阀_德国FESTO电磁阀_德国FESTO气缸 | 二手Sciex液质联用仪-岛津气质联用仪-二手安捷伦气质联用仪-上海隐智科学仪器有限公司 | 蔬菜清洗机_环速洗菜机_异物去除清洗机_蔬菜清洗机_商用洗菜机 - 环速科技有限公司 | 防火门-专业生产甲级不锈钢钢质防火门厂家资质齐全-广东恒磊安防设备有限公司 | ★店家乐|服装销售管理软件|服装店收银系统|内衣店鞋店进销存软件|连锁店管理软件|收银软件手机版|会员管理系统-手机版,云版,App | 北京遮阳网-防尘盖土网-盖土草坪-迷彩网-防尘网生产厂家-京兴科技 | 超声波破碎仪-均质乳化机(供应杭州,上海,北京,广州,深圳,成都等地)-上海沪析实业有限公司 | 上海风淋室_上海风淋室厂家_上海风淋室价格_上海伯淋 | 西宁装修_西宁装修公司-西宁业之峰装饰-青海业之峰墅级装饰设计公司【官网】 | 油漆辅料厂家_阴阳脚线_艺术漆厂家_内外墙涂料施工_乳胶漆专用防霉腻子粉_轻质粉刷石膏-魔法涂涂 | 芝麻黑-芝麻黑石材厂家-永峰石业| SMC-SMC电磁阀-日本SMC气缸-SMC气动元件展示网 | 塑料薄膜_PP薄膜_聚乙烯薄膜-常州市鑫美新材料包装厂 | 贵州科比特-防雷公司厂家提供贵州防雷工程,防雷检测,防雷接地,防雷设备价格,防雷产品报价服务-贵州防雷检测公司 | 工业铝型材生产厂家_铝合金型材配件批发精加工定制厂商 - 上海岐易铝业 | Safety light curtain|Belt Sway Switches|Pull Rope Switch|ultrasonic flaw detector-Shandong Zhuoxin Machinery Co., Ltd | 农业四情_农业气象站_田间小型气象站_智慧农业气象站-山东风途物联网 | 二手光谱仪维修-德国OBLF光谱仪|进口斯派克光谱仪-热电ARL光谱仪-意大利GNR光谱仪-永晖检测 | 大连海岛旅游网>>大连旅游,大连海岛游,旅游景点攻略,海岛旅游官网 | 广州活动策划公司-15+年专业大型公关活动策划执行管理经验-睿阳广告 | 蓝鹏测控平台 - 智慧车间系统 - 车间生产数据采集与分析系统 | 杭州实验室尾气处理_实验台_实验室家具_杭州秋叶实验设备有限公司 | QQ房产导航-免费收录优秀房地产网站_房地产信息网 | 鹤壁创新仪器公司-全自动量热仪,定硫仪,煤炭测硫仪,灰熔点测定仪,快速自动测氢仪,工业分析仪,煤质化验仪器 | 衬塑设备,衬四氟设备,衬氟设备-淄博鲲鹏防腐设备有限公司 | 耐酸碱泵-自吸耐酸碱泵型号「品牌厂家」立式耐酸碱泵价格-昆山国宝过滤机有限公司首页 | 不锈钢水箱生产厂家_消防水箱生产厂家-河南联固供水设备有限公司 | 塑钢件_塑钢门窗配件_塑钢配件厂家-文安县启泰金属制品有限公司 深圳南财多媒体有限公司介绍 | 琉璃瓦-琉璃瓦厂家-安徽盛阳新型建材科技有限公司 | 聚丙烯酰胺PAM-聚合氯化铝PAC-絮凝剂-河南博旭环保科技有限公司 巨野电机维修-水泵维修-巨野县飞宇机电维修有限公司 | 彭世修脚_修脚加盟_彭世修脚加盟_彭世足疗加盟_足疗加盟连锁_彭世修脚技术培训_彭世足疗 | 胜为光纤光缆_光纤跳线_单模尾纤_光纤收发器_ODF光纤配线架厂家直销_北京睿创胜为科技有限公司 - 北京睿创胜为科技有限公司 | 深圳网站建设-高端企业网站开发-定制网页设计制作公司 | 合肥注册公司|合肥代办营业执照、2024注册公司流程 | 浇钢砖,流钢砖_厂家价低-淄博恒森耐火材料有限公司 | 台湾Apex减速机_APEX行星减速机_台湾精锐减速机厂家代理【现货】-杭州摩森机电 |