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

MySQL優(yōu)化及索引解析

 更新時(shí)間:2022年03月17日 08:31:17   作者:淚夢紅塵BLOG  
這篇文章主要介紹了MySQL優(yōu)化及索引解析,索引關(guān)系型數(shù)據(jù)庫為了加速對表中行數(shù)據(jù)檢索的數(shù)據(jù)結(jié)構(gòu),下面文章詳細(xì)內(nèi)容,需要的小伙伴可以參考一下

索引簡單介紹

索引的本質(zhì):

  • MySQL索引或者說其他關(guān)系型數(shù)據(jù)庫的索引的本質(zhì)就只有一句話,以空間換時(shí)間。

索引的作用:

  • 索引關(guān)系型數(shù)據(jù)庫為了加速對表中行數(shù)據(jù)檢索的(磁盤存儲(chǔ)的)數(shù)據(jù)結(jié)構(gòu)

索引的分類

數(shù)據(jù)結(jié)構(gòu)上面的分類:

  • HASH 索引
    • 等值匹配效率高
    • 不支持范圍查找
  • 樹形索引
    • 二叉樹,遞歸二分查找法,左小右大
    • 平衡二叉樹,二叉樹到平衡二叉樹,主要原因是左旋右旋
    • 缺點(diǎn)1,IO次數(shù)過多
    • 缺點(diǎn)2,IO利用率不高,IO飽和度
  • 多路平衡查找樹(B-Tree)
    • 特點(diǎn),大大的減少了樹的高度
  • B+樹
    • 特點(diǎn),采用左閉合的比較方式
    • 根節(jié)點(diǎn)支節(jié)點(diǎn)沒有數(shù)據(jù)區(qū),只有葉子結(jié)點(diǎn)才包含數(shù)據(jù)區(qū)(說白了就是即便在根節(jié)點(diǎn)和子節(jié)點(diǎn)已經(jīng)定位到,因?yàn)闆]有數(shù)據(jù)區(qū)的原因也不會(huì)停留,會(huì)一直找到葉子結(jié)點(diǎn)為止。)

當(dāng)我們搜索13這條數(shù)據(jù)時(shí),在根節(jié)點(diǎn)和子節(jié)點(diǎn) 都能定位,但是一直會(huì)找到葉子結(jié)點(diǎn)。

二叉樹平衡二叉樹,B樹對比:

如圖顯示如果是自增主鍵情況下:

二叉樹顯然不適合做關(guān)系型數(shù)據(jù)庫索引(和全表掃描沒什么區(qū)別)。

平衡二叉樹呢,雖然解決了這種情況,但是同樣會(huì)導(dǎo)致這棵樹,又瘦又高,這同樣會(huì)造成上文所提到查詢IO次數(shù)過多以及IO利用率不高。

B樹呢,顯然已經(jīng)解決了這兩個(gè)問題,所以下文來解釋,為什么在這種情況下MySQL還用了B+樹,又做了那些增強(qiáng)。

B樹和B+樹比較:

B+樹在B樹上面的優(yōu)化:

IO效率更高(B樹每個(gè)節(jié)點(diǎn)都會(huì)保留數(shù)據(jù)區(qū),而B+樹則不會(huì),假設(shè)我們查詢一條數(shù)據(jù)要遍歷三層,那么顯然B+樹查詢中IO消耗更?。?/p>

范圍查找效率更高(如圖,B+樹已經(jīng)形成了一個(gè)天然鏈表形式,只需要根據(jù)最結(jié)尾的鏈?zhǔn)浇Y(jié)構(gòu)查找)

基于索引的數(shù)據(jù)掃描效率更高。

索引類型的分類

索引類型可分為兩類:

  • 主鍵索引
  • 輔佐索引(二級索引)
    • 唯一性索引
    • 復(fù)合索引
    • 普通索引
    • 覆蓋索引

主鍵索引相對來說性能是最好的,但是對于SQL優(yōu)化,其實(shí)大多時(shí)候我們都在輔佐索引上面做一些改進(jìn)和補(bǔ)充。

B+樹在儲(chǔ)存引擎層面落地

  • 我們創(chuàng)建兩個(gè)表分別為test_innodb(采用InnoDB作為儲(chǔ)存引擎)test_myisam(采用MyISAM作為儲(chǔ)存引擎)下圖是兩張表磁盤落地的相關(guān)文件,這兩個(gè)儲(chǔ)存引擎在B+樹磁盤落地式截然不同的。

B+樹在MyISAM落地:

  • *.frm文件是表格骨架文件比如這個(gè)表中的id字段name字段是什么類型的存儲(chǔ)在這里
  • *.MYD(D=data)則儲(chǔ)存數(shù)據(jù)
  • *.MYI (I=index)則儲(chǔ)存索引

  • 比如現(xiàn)在執(zhí)行如下sql語句 ,那么在MyISAM中他就是先在test_myisam.MYI中查找到103然后拿到0x194281這個(gè)地址然后再去test_myisam.MYD中找到這個(gè)數(shù)據(jù)返回。
SELECT id,name from test_myisam where id =103

  • 如果test_myisam表中,id為主鍵索引,name也是一個(gè)索引,那么在test_myisam.MYI中則會(huì)有兩個(gè)平級的B+樹,這也導(dǎo)致MyISAM引擎中主鍵索引和二級索引是沒有主次之分的,是平級關(guān)系。因?yàn)檫@種機(jī)制在MyISAM引擎中,有可能使用多個(gè)索引,在InnoDB中則不會(huì)出現(xiàn)這種情況。

B+樹在InnoDB落地:

  • InnoDB不像MyISAM來獨(dú)立一個(gè)MYD 文件來存儲(chǔ)數(shù)據(jù),它的數(shù)據(jù)直接存儲(chǔ)在葉子結(jié)點(diǎn)關(guān)鍵字對應(yīng)的數(shù)據(jù)區(qū)在這保存這一個(gè)id列所有行的詳細(xì)記錄。
  • InnoDB 主鍵索引和輔助索引關(guān)系

我們現(xiàn)在執(zhí)行如下SQL語句,他會(huì)先去找輔助索引,然后找到輔助索引下101的主鍵,再去回表(二次掃描)根據(jù)主鍵索引查詢103這條數(shù)據(jù)將其返回。

SELECT id,name from test_myisam where name ='zhangsan'

這里就有一個(gè)問題了,為什么不像MyISAM在輔助索引下直接記錄磁盤地址,而是要多此一舉再去回表掃描主鍵索引,這個(gè)問題在下面相關(guān)面試題中回答,記一下這個(gè)問題是這里來的。

相關(guān)面試題

  • 為什么MySQL選擇B+樹作為索引結(jié)構(gòu)

這個(gè)就不說了,上文應(yīng)該講清楚了。

  • B+樹在MyISAM和InnoDB落地區(qū)別。

這個(gè)可以總結(jié)一下,MyISAM落地?cái)?shù)據(jù)儲(chǔ)存會(huì)有三個(gè)類型文件 ,.frm文件是表骨架文件,.MYD(D=data)則儲(chǔ)存數(shù)據(jù) ,.MYI (I=index)則儲(chǔ)存索引,MyISAM引擎中主鍵索引和二級索引平級關(guān)系,在MyISAM引擎中,有可能使用多個(gè)索引,InnoDB則相反,主鍵索引和二級索有嚴(yán)格的主次之分在InnoDB一條語句只能用一個(gè)索引要么不用。

  • 如何判斷一條sql語句是否使用了索引。

可以通過執(zhí)行計(jì)劃來判斷 可以在sql語句前explain/ desc

set global optimizer_trace='enabled=on' 打開執(zhí)行計(jì)劃開關(guān)他將會(huì)把每一條查詢sql執(zhí)行計(jì)劃記錄在information_schema 庫中OPTIMIZER_TRACE表中

  • 為什么主鍵索引最好選擇自增列?

自增列,數(shù)據(jù)插入時(shí)整個(gè)索引樹是只有右邊在增加的,相對來說索引樹的變動(dòng)更小。

  • 為什么經(jīng)常變動(dòng)的列不建議使用索引?

和上一個(gè)問題原因一樣,當(dāng)一個(gè)索引經(jīng)常發(fā)生變化,那么就意味這,這個(gè)縮印樹也要經(jīng)常發(fā)生變化。4

  • 為什么說重復(fù)度高的列,不建議建立索引?

這個(gè)原因是因?yàn)殡x散性,比如說,一張一百萬數(shù)據(jù)的表,其中一個(gè)字段代表性別,0代表男1代表女,把這字段加了索引,那么在索引樹上,將會(huì)有大量的重復(fù)數(shù)據(jù)。而我們常見的索引建立一般都是驅(qū)動(dòng)型的。其目的是,盡可能的刪減數(shù)據(jù)的查詢范圍,這個(gè)顯然是不匹配的。

  • 什么是聯(lián)合索引

聯(lián)合索引是一個(gè)包含了多個(gè)功效的索引,他只是一個(gè)索引而不是多個(gè),

其次,單列索引是一種特殊的聯(lián)合索引

聯(lián)合索引的創(chuàng)立要遵循最左前置原則(最常用列>離散度>占用空間?。?/p>

  • 什么是覆蓋索引

通過索引項(xiàng)信息可直接返回所需要查詢的索引列,該索引被稱之為覆蓋索引,說白了就是不需要做回表操作,可以從二級索引中直接取到所需數(shù)據(jù)。

  • 什么是ICP機(jī)制

索引下推,簡單點(diǎn)來說就是,在sql執(zhí)行過程中,面對where多條件過濾時(shí),通過一個(gè)索引,完成數(shù)據(jù)搜索和過濾條件其,特點(diǎn)能減少io操作。

  • 在InnoDB表中不可能沒有主鍵對還是不對原因是什么?

首先這句話是對的,但是情況有三種:

  • 就是在你手動(dòng)顯式指定這一個(gè)字段為主鍵時(shí)候,會(huì)以這一個(gè)字段為聚集索引。
  • 在沒有顯式指定主鍵時(shí)候有兩種情況:
  • 他會(huì)尋找第一個(gè)UK(unique key)作為主鍵索引組織索引編排。
  • 如果既沒有指定主鍵也沒有UK的情況下,此時(shí)會(huì)以rowId(在InnoDB表中每一個(gè)記錄都會(huì)有一個(gè)隱藏(6byte)的rowId)為聚集索引。
  • 什么是回表操作

在InnoDB 中基于輔助索引查詢的內(nèi)容,從輔助索引中無法直接獲取,需要基于主鍵索引的二次掃描的操作叫做回表操作。

  • 為什么在InnoDB 中輔助索引葉子結(jié)點(diǎn)數(shù)據(jù)區(qū)記錄的是主鍵索引的值而不是像MyISAM中去記錄磁盤地址。

這個(gè)原因其實(shí)很簡單,因?yàn)橹麈I索引的數(shù)據(jù)結(jié)構(gòu)是會(huì)經(jīng)常發(fā)生變化的,如果在輔助索引數(shù)據(jù)區(qū)記錄磁盤地址,那么假設(shè)我們有10個(gè)輔助索引,當(dāng)我們主鍵索引結(jié)構(gòu)發(fā)生變化后,還要一個(gè)個(gè)去通知輔助索引,且主鍵索引結(jié)構(gòu)是經(jīng)常發(fā)生變化的,增刪都有可能影響他的
數(shù)據(jù)結(jié)構(gòu)。

 到此這篇關(guān)于MySQL優(yōu)化及索引解析的文章就介紹到這了,更多相關(guān)MySQL優(yōu)化索引內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL8數(shù)據(jù)庫安裝及SQL語句詳解

    MySQL8數(shù)據(jù)庫安裝及SQL語句詳解

    本文詳細(xì)講解了MySQL8數(shù)據(jù)庫安裝及SQL語句用法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-02-02
  • MySQL 刪除數(shù)據(jù)庫中重復(fù)數(shù)據(jù)方法小結(jié)

    MySQL 刪除數(shù)據(jù)庫中重復(fù)數(shù)據(jù)方法小結(jié)

    在實(shí)際項(xiàng)目中,我們經(jīng)常會(huì)遇到刪除數(shù)據(jù)庫中重復(fù)數(shù)據(jù)的問題,貌似是很簡單的問題哈,下面我們來探討下
    2014-07-07
  • mysql charset=utf8你真的弄明白意思了嗎

    mysql charset=utf8你真的弄明白意思了嗎

    這篇文章主要介紹了mysql charset=utf8你真的弄明白意思了嗎?文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • Mysql?8.0解壓版下載安裝以及配置的實(shí)例教程

    Mysql?8.0解壓版下載安裝以及配置的實(shí)例教程

    MySQL的安裝分為兩種,一種是安裝版本,一種是免安裝解壓版本,一般老師都會(huì)推薦免安裝解壓版本,用起來更方便些,下面這篇文章主要給大家介紹了關(guān)于Mysql?8.0解壓版下載安裝以及配置的相關(guān)資料,需要的朋友可以參考下
    2022-01-01
  • 簡述MySQL主鍵和外鍵使用及說明

    簡述MySQL主鍵和外鍵使用及說明

    MySQL通過外鍵約束來保證表與表之間的數(shù)據(jù)的完整性和準(zhǔn)確性,本文主要介紹了簡述MySQL主鍵和外鍵使用及說明,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Ubuntu系統(tǒng)安裝與配置MySQL

    Ubuntu系統(tǒng)安裝與配置MySQL

    這篇文章介紹了Ubuntu系統(tǒng)安裝與配置MySQL的方法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • Mysql數(shù)據(jù)庫常用命令操作大全

    Mysql數(shù)據(jù)庫常用命令操作大全

    這篇文章主要介紹了Mysql常用命令操作方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • 詳解MySQL中事務(wù)的持久性實(shí)現(xiàn)原理

    詳解MySQL中事務(wù)的持久性實(shí)現(xiàn)原理

    這篇文章主要介紹了詳解MySQL中事務(wù)的持久性實(shí)現(xiàn)原理,幫助大家更好的理解和使用MySQL數(shù)據(jù)庫,感興趣的朋友可以了解下
    2021-01-01
  • SQL面試之WHERE?1=1到底是什么意思詳解

    SQL面試之WHERE?1=1到底是什么意思詳解

    這篇文章主要給大家介紹了關(guān)于SQL面試之WHERE?1=1到底是什么意思的相關(guān)資料,WHERE 1=1子句只是一些開發(fā)人員采用的一種慣性做法,以簡化靜態(tài)和動(dòng)態(tài)形式的SQL語句的使用,文中介紹的非常詳細(xì),需要的朋友可以參考下
    2023-09-09
  • centos6.4下mysql5.7.18安裝配置方法圖文教程

    centos6.4下mysql5.7.18安裝配置方法圖文教程

    這篇文章主要為大家詳細(xì)介紹了centos6.4下mysql5.7.18安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07

最新評論

买车| 丰都县| 中江县| 江安县| 银川市| 台东市| 宝丰县| 银川市| 浦北县| 金湖县| 盘山县| 夏邑县| 民乐县| 会泽县| 涟水县| 城步| 西乌珠穆沁旗| 古丈县| 彰化市| 武川县| 太仆寺旗| 灵璧县| 建德市| 巴中市| 保山市| 山丹县| 隆回县| 名山县| 双牌县| 微山县| 沙湾县| 桃园县| 福鼎市| 灯塔市| 普兰县| 廊坊市| 聊城市| 榕江县| 永泰县| 军事| 菏泽市|