日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
為什么SQL語句命中索引比不命中索引要快?

?有位粉絲面試高開的時候被問到,為什么SQL語句命中索引比不命中索引要快?雖然自己也知道答案,但被問到的瞬間,就不知道如何組織語言了。今天,我給大家深度分析一下。

“只有客戶發(fā)展了,才有我們的生存與發(fā)展!”這是創(chuàng)新互聯(lián)公司的服務宗旨!把網(wǎng)站當作互聯(lián)網(wǎng)產(chǎn)品,產(chǎn)品思維更注重全局思維、需求分析和迭代思維,在網(wǎng)站建設中就是為了建設一個不僅審美在線,而且實用性極高的網(wǎng)站。創(chuàng)新互聯(lián)對成都網(wǎng)站建設、成都網(wǎng)站設計、網(wǎng)站制作、網(wǎng)站開發(fā)、網(wǎng)頁設計、網(wǎng)站優(yōu)化、網(wǎng)絡推廣、探索永無止境。

1.索引的作用

想象一下,現(xiàn)在有一本包含幾十萬字的字典,有幾百頁厚,同時里面的字是無序排列的。如果在不使用目錄的情況下,我們?nèi)绾螐淖值渲姓页鲂枰淖謥砟??毫無疑問,我們只能一頁一頁地翻,顯然,這是一項反人類的的工作。

我們必然想的是先看目錄,然后,找到相關(guān)的字或者偏旁,然后,找到對應的頁碼再去查找想要找的文字,這樣,效率就大大提高了。而事實上,目錄就是一種索引,我們說的數(shù)據(jù)庫索引思想和目錄的思想一脈相承。

數(shù)據(jù)庫索引最主要的作用就是幫助我們快速檢索到想要的數(shù)據(jù),從而不至于每次查詢都做全局掃描。

假設不使用任何算法的情況下,我們要查詢10萬條記錄中的某一條,在最壞的情況下需要遍歷10萬次。

但如果使用二分查找算法,則只需要進行l(wèi)og2 20000次,也就是14.287712次即可。這意味著我們只需對排序后的值進行14次搜索,就可以使用二分查找到想要的唯一值,常見的索引數(shù)據(jù)結(jié)構(gòu)有B樹和B+樹。

下面我們,以MySQL的InnoDB引擎為例,分析一下索引的工作原理。

2.索引執(zhí)行原理

我們知道MySQL的InnoDB引擎采用的是B+樹數(shù)據(jù)結(jié)構(gòu),當我們?nèi)?zhí)行SELECT語句查詢數(shù)據(jù)的時候,InnoDB需要從磁盤上去讀取數(shù)據(jù),而這個過程會涉及到磁盤 以及磁盤的隨機IO ,我們來看這么一個圖:

系統(tǒng)會把數(shù)據(jù)的邏輯地址傳給磁盤,磁盤控制線路按照尋址邏輯把邏輯地址翻譯成物理地址。也就是確定要讀取的數(shù)據(jù)在哪個磁道、哪個扇區(qū)。為了讀取這個扇區(qū)的數(shù)據(jù),需要把磁頭放在這個扇區(qū)上面,為了實現(xiàn)這樣一個點,磁盤會不斷地去旋轉(zhuǎn)。把目標扇區(qū)旋轉(zhuǎn)到磁頭下面,使得磁頭能夠去找到對應的磁道。這里還會涉及到尋道的時間以及旋轉(zhuǎn)時間的一個損耗。很明顯磁盤IO這個過程的性能開銷是非常大的,尤其是查詢的數(shù)據(jù)量比較多的情況下。

所以InnotDB里面,干脆對存儲在磁盤上的數(shù)據(jù)建立一個索引,然后把索引數(shù)據(jù)以及索引列對應的磁盤地址以B+樹的方式進行存儲。來看這么一個圖:

當我們需要查找目標數(shù)據(jù)的時候,根據(jù)索引從B+樹中去查找目標數(shù)據(jù)就行了。由于B+樹的子樹比較多,所以,只需要較少次數(shù)的磁盤IO就能夠查找到目標數(shù)據(jù)。

至于B+樹的數(shù)據(jù)結(jié)構(gòu),在這里就不分析了。大家可以去我的個人主頁看往期視頻有講到。

3.索引的弊端

雖然,使用索引能減少磁盤IO次數(shù),提高查詢效率,但是,索引也不能建立太多。如果一個表中所有字段的索引很大,也會導致性能 l下降。想象一下,如果一個索引和一個表一樣長,那么它將再次成為一個需要檢查的開銷。這就好比字典的目錄非常詳細,但是其長度已經(jīng)和所有的文字一樣長,這個時候目錄本身的效率就大大下降了。

那索引有弊端嗎?肯定是有的,索引可以提高查詢讀取性能,而它會將降低寫入性能。當有索引時,如果更改一條記錄,或者在數(shù)據(jù)庫中插入一條新的記錄,它將執(zhí)行兩個寫入操作(一個操作是寫入記錄本身,另一個操作是將更新索引)。

因此,在定義索引時,必須牢記以下幾點:

  • 索引表中的每個字段將降低寫入性能。
  • 建議使用表中的唯一值為字段編制索引。
  • 在關(guān)系數(shù)據(jù)庫中充當外鍵的字段必須建立索引,因為它們有助于跨多個表進行復雜查詢。
  • 索引還使用磁盤空間,因此在選擇要索引的字段時要小心。

分享題目:為什么SQL語句命中索引比不命中索引要快?
鏈接URL:http://m.5511xx.com/article/coshoco.html