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

InnoDB主鍵索引樹(shù)和二級(jí)索引樹(shù)的場(chǎng)景分析

 更新時(shí)間:2022年03月11日 10:44:36   作者:BugMaker-shen  
本文通過(guò)場(chǎng)景分析給大家介紹了InnoDB主鍵索引樹(shù)和二級(jí)索引樹(shù)的問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

我們這里討論InnoDB存儲(chǔ)引擎,數(shù)據(jù)和索引存儲(chǔ)在同一個(gè)文件student.ibd

場(chǎng)景1:主鍵索引樹(shù)

uid是主鍵,其他字段沒(méi)有添加任何索引

select * from student;

如果是這樣查詢(xún),這表示整表搜索,從左到右遍歷葉子節(jié)點(diǎn)鏈表,從小到大訪(fǎng)問(wèn)

select * from student where uid<5;

如果是這樣查詢(xún),這表示范圍查詢(xún),就直接在有序鏈表中遍歷搜索就可以了,直到遍歷到第一個(gè)不小于5的key結(jié)束遍歷

select * from student where uid=5;

如果是這樣查詢(xún),這表示等值查詢(xún),在索引樹(shù)上進(jìn)行二分查找即可

由于name沒(méi)有索引,于是做整表搜索

select * from student where name='linfeng';

場(chǎng)景2:二級(jí)索引樹(shù)

uid是主鍵,以name創(chuàng)建了普通索引(二級(jí)索引)

以name為索引構(gòu)建的索引樹(shù),稱(chēng)為輔助索引樹(shù),也叫做二級(jí)索引樹(shù)。key是輔助索引字段name的值,然后還有外加uid主鍵的值

在輔助索引樹(shù)上,key是輔助索引的值,也就是name;data數(shù)據(jù)值是所在記錄行的主鍵值(PRIMARY KEY),也就是uid(并不是表的一行數(shù)據(jù))

分析語(yǔ)句1:

select name from student where name='linfeng';

因?yàn)檫^(guò)濾字段是name且 只select了name一個(gè)字段,name有索引,索引樹(shù)上直接就有,所以從name的二級(jí)索引樹(shù)上去等值匹配linfeng

分析語(yǔ)句2:

select uid,name from student where name='linfeng';

這種情況select的是name和uid,而這些在二級(jí)索引樹(shù)上也是直接就有,所以搜索二級(jí)索引樹(shù)就完事了。

分析語(yǔ)句3:

select * from student where name='linfeng';

這種情況下就涉及到回表了,這是一個(gè)很重要的概念。由于name字段有索引,所以我們會(huì)到name字段構(gòu)建的二級(jí)索引樹(shù)上去查找。但二級(jí)索引樹(shù)沒(méi)有linfeng這個(gè)人所有的信息,所以完整的查詢(xún)過(guò)程應(yīng)該是這樣的:

  • 用linfeng到二級(jí)索引樹(shù)上進(jìn)行匹配,拿到二級(jí)索引樹(shù)上存儲(chǔ)的uid
  • 然后拿著這個(gè)uid去主索引樹(shù)上去匹配,最后拿到linfeng的所有信息(回表


而這個(gè)回表意味著更多的磁盤(pán)I/O,會(huì)影響效率,如果業(yè)務(wù)只需要uid、name,就別寫(xiě)select *了,這樣可以避免回表

分析語(yǔ)句4:

我們刪除name的索引后執(zhí)行以下語(yǔ)句

select * from student where age=20 order by name;

沒(méi)有用到索引,還使用外部排序了。此外我們還看到using filesort,這時(shí)需要優(yōu)化了。

我們的過(guò)濾條件是age,先給age添加索引,看看行不行

可以看到,age命中索引了,查詢(xún)age所在的索引樹(shù)。由于我們寫(xiě)的是select *,依然存在回表。還有using filesort,因?yàn)槭褂胊ge=20查詢(xún)到的結(jié)果是多個(gè),然而name此時(shí)是沒(méi)有順序的,所以還需要再進(jìn)行外部排序。

那能不能通過(guò)給name加載索引來(lái)解決問(wèn)題呢?

不能,因?yàn)橐淮蜸QL執(zhí)行只能用到1個(gè)索引,搜索了這個(gè)字段的索引樹(shù)就不會(huì)再去搜索另一個(gè)字段的索引樹(shù)了,因?yàn)榧虞d索引是要耗費(fèi)磁盤(pán)I/O的,查找多個(gè)索引樹(shù)就太慢了!

分析:既然索引樹(shù)上只能存自己建立的索引字段以及主鍵,那我們把需要查詢(xún)的字段都設(shè)置成索引不就好了?

解決方法:我們可以在二級(jí)索引樹(shù)上的key:age+name,形成聯(lián)合索引,先按age排序,age相同了,再按name排序

再次select *

這時(shí)候就使用到聯(lián)合索引了,而且沒(méi)有using filesort,這次是這樣查詢(xún)的:

先用age=20在輔助索引樹(shù)上查找,如果數(shù)據(jù)足夠會(huì)找到多個(gè)結(jié)果,這個(gè)結(jié)果就是已經(jīng)排好序的,不需要再u(mài)sing filesort

我們現(xiàn)在直接用第二個(gè)字段name作為過(guò)濾條件

我們看到這里沒(méi)有用到索引,因?yàn)槲覀冇?age,name)創(chuàng)建索引,是先按age排序,再按name排序。如果我們只用name作為過(guò)濾條件,這就沒(méi)有辦法使用索引匹配了,因?yàn)槭莾?yōu)先用age排序。

所以我們經(jīng)常說(shuō),多列索引一定要使用到第1個(gè)字段,這樣才能用到索引!

在建立(age,name)聯(lián)合索引的情況下,以下操作不回表(到二級(jí)索引樹(shù)上搜索,再去主索引樹(shù)上搜索):

  • select age
  • select age, name
  • select uid,age,name

以下操作要回表

  • select *
  • select age,name,sex

到此這篇關(guān)于InnoDB主鍵索引樹(shù)和二級(jí)索引樹(shù)的文章就介紹到這了,更多相關(guān)InnoDB索引樹(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 介紹PostgreSQL中的Lateral類(lèi)型

    介紹PostgreSQL中的Lateral類(lèi)型

    這篇文章主要介紹了介紹PostgreSQL中的Lateral類(lèi)型,Lateral是PostgreSQL9.3版本以來(lái)加入的內(nèi)置類(lèi)型,需要的朋友可以參考下
    2015-04-04
  • 你真的知道怎么優(yōu)化SQL嗎

    你真的知道怎么優(yōu)化SQL嗎

    這篇文章主要給大家介紹了關(guān)于優(yōu)化SQL的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用SQL具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • C#表格開(kāi)發(fā)之DataGridView控件詳解

    C#表格開(kāi)發(fā)之DataGridView控件詳解

    本文主要介紹了DataGridView控件的使用方法,包括手動(dòng)填充數(shù)據(jù)、插入行、修改單元格值以及綁定數(shù)據(jù)源,通過(guò)DataGridView控件,可以方便地顯示和編輯表格數(shù)據(jù),適用于各種類(lèi)型的數(shù)據(jù)源
    2024-12-12
  • JetBrains出品一款好用到爆的DataGrip數(shù)據(jù)庫(kù)工具使用入門(mén)

    JetBrains出品一款好用到爆的DataGrip數(shù)據(jù)庫(kù)工具使用入門(mén)

    這篇文章主要介紹了JetBrains出品一款好用到爆的DataGrip數(shù)據(jù)庫(kù)工具使用入門(mén),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • Access轉(zhuǎn)成SQL數(shù)據(jù)庫(kù)的方法

    Access轉(zhuǎn)成SQL數(shù)據(jù)庫(kù)的方法

    很多朋友想用SQL2000數(shù)據(jù)庫(kù)的編程方法,但是卻又苦于自己是學(xué)ACCESS的,對(duì)SQL只是一點(diǎn)點(diǎn)的了解而已,這里我給大家提供以下參考---將ACCESS轉(zhuǎn)化成SQL2000的方法和注意事項(xiàng)。
    2015-09-09
  • 大數(shù)據(jù)開(kāi)發(fā)phoenix連接hbase流程詳解

    大數(shù)據(jù)開(kāi)發(fā)phoenix連接hbase流程詳解

    HBase是一個(gè)分布式的、面向列的開(kāi)源數(shù)據(jù)庫(kù),該技術(shù)來(lái)源于?Fay?Chang?所撰寫(xiě)的Google論文“Bigtable:一個(gè)結(jié)構(gòu)化數(shù)據(jù)的分布式存儲(chǔ)系統(tǒng)”。就像Bigtable利用了Google文件系統(tǒng)(File?System)所提供的分布式數(shù)據(jù)存儲(chǔ)一樣,HBase在Hadoop之上提供了類(lèi)似于Bigtable的能力
    2022-11-11
  • 詳解 MapperScannerConfigurer之sqlSessionFactory注入方式

    詳解 MapperScannerConfigurer之sqlSessionFactory注入方式

    這篇文章主要介紹了詳解 MapperScannerConfigurer之sqlSessionFactory注入方式的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • 使用SQL語(yǔ)句查詢(xún)MySQL,SQLServer,Oracle所有數(shù)據(jù)庫(kù)名和表名,字段名

    使用SQL語(yǔ)句查詢(xún)MySQL,SQLServer,Oracle所有數(shù)據(jù)庫(kù)名和表名,字段名

    本文例出了使用SQL語(yǔ)句查詢(xún)MySQL,SQLServer,Oracle所有數(shù)據(jù)庫(kù)名和表名的SQL語(yǔ)句,有需要的可以參考下
    2018-03-03
  • 建立在Tablestore的Wifi設(shè)備監(jiān)管系統(tǒng)架構(gòu)實(shí)現(xiàn)

    建立在Tablestore的Wifi設(shè)備監(jiān)管系統(tǒng)架構(gòu)實(shí)現(xiàn)

    一般大公司會(huì)有許多園區(qū),園區(qū)內(nèi)會(huì)有不同部門(mén)的同事在一起辦公。每個(gè)園區(qū)內(nèi)都要配備大量的Wifi設(shè)備從而為園區(qū)同事提供方便的上網(wǎng)服務(wù)。因此,集團(tuán)需要一套完善的監(jiān)管系統(tǒng)維護(hù)所有的Wifi設(shè)備。需要的朋友來(lái)一起學(xué)習(xí)下吧
    2019-05-05
  • 處理Hive中的數(shù)據(jù)傾斜的方法

    處理Hive中的數(shù)據(jù)傾斜的方法

    數(shù)據(jù)傾斜是大數(shù)據(jù)處理不可避免會(huì)遇到的問(wèn)題,那么在Hive中數(shù)據(jù)傾斜又是如何導(dǎo)致的?通過(guò)本片本章,你可以清楚的認(rèn)識(shí)為什么Hive中會(huì)發(fā)生數(shù)據(jù)傾斜;發(fā)生數(shù)據(jù)傾斜時(shí)我們又該用怎么的方案去解決不同的數(shù)據(jù)傾斜問(wèn)題,需要的朋友可以參考下
    2024-10-10

最新評(píng)論

大埔县| 额敏县| 鸡东县| 藁城市| 文化| 普格县| 墨竹工卡县| 榆中县| 长治县| 青冈县| 泰顺县| 英德市| 泉州市| 磐石市| 长治县| 望城县| 阿拉善盟| 巴彦淖尔市| 枝江市| 林甸县| 墨玉县| 谷城县| 邛崃市| 安徽省| 临泉县| 城口县| 同心县| 汾西县| 容城县| 神木县| 体育| 宾川县| 南溪县| 新安县| 铜鼓县| 武威市| 宁晋县| 富民县| 江油市| 九江市| 绥江县|