Python MYSQL 索引的原理

      網(wǎng)友投稿 791 2025-04-04

      一、 初識索引


      為什么要有索引?

      一般的應(yīng)用系統(tǒng),讀寫比例在10:1左右,而且插入操作和一般的更新操作很少出現(xiàn)性能問題,在生產(chǎn)環(huán)境中,我們遇到最多的,也是最容易出問題的,還是一些復(fù)雜的查詢操作,因此對查詢語句的優(yōu)化顯然是重中之重。說起加速查詢,就不得不提到索引了。

      什么是索引?

      索引在MySQL中也叫是一種“鍵”,是存儲引擎用于快速找到記錄的一種數(shù)據(jù)結(jié)構(gòu)。索引對于良好的性能

      非常關(guān)鍵,尤其是當(dāng)表中的數(shù)據(jù)量越來越大時,索引對于性能的影響愈發(fā)重要。

      索引優(yōu)化應(yīng)該是對查詢性能優(yōu)化最有效的手段了。索引能夠輕易將查詢性能提高好幾個數(shù)量級。

      索引相當(dāng)于字典的音序表,如果要查某個字,如果不使用音序表,則需要從幾百頁中逐頁去查。

      你是否對索引存在誤解?

      索引是應(yīng)用程序設(shè)計和開發(fā)的一個重要方面。若索引太多,應(yīng)用程序的性能可能會受到影響。而索引太少,對查詢性能又會產(chǎn)生影響,要找到一個平衡點(diǎn),這對應(yīng)用程序的性能至關(guān)重要。一些開發(fā)人員總是在事后才想起添加索引----我一直認(rèn)為,這源于一種錯誤的開發(fā)模式。如果知道數(shù)據(jù)的使用,從一開始就應(yīng)該在需要處添加索引。開發(fā)人員往往對數(shù)據(jù)庫的使用停留在應(yīng)用的層面,比如編寫SQL語句、存儲過程之類,他們甚至可能不知道索引的存在,或認(rèn)為事后讓相關(guān)DBA加上即可。DBA往往不夠了解業(yè)務(wù)的數(shù)據(jù)流,而添加索引需要通過監(jiān)控大量的SQL語句進(jìn)而從中找到問題,這個步驟所需的時間肯定是遠(yuǎn)大于初始添加索引所需的時間,并且可能會遺漏一部分的索引。當(dāng)然索引也并不是越多越好,我曾經(jīng)遇到過這樣一個問題:某臺MySQL服務(wù)器iostat顯示磁盤使用率一直處于100%,經(jīng)過分析后發(fā)現(xiàn)是由于開發(fā)人員添加了太多的索引,在刪除一些不必要的索引之后,磁盤使用率馬上下降為20%。可見索引的添加也是非常有技術(shù)含量的。

      二 、索引的原理

      一 索引原理

      索引的目的在于提高查詢效率,與我們查閱圖書所用的目錄是一個道理:先定位到章,然后定位到該章下的一個小節(jié),然后找到頁數(shù)。相似的例子還有:查字典,查火車車次,飛機(jī)航班等

      Python MYSQL 索引的原理

      本質(zhì)都是:通過不斷地縮小想要獲取數(shù)據(jù)的范圍來篩選出最終想要的結(jié)果,同時把隨機(jī)的事件變成順序的事件,也就是說,有了這種索引機(jī)制,我們可以總是用同一種查找方式來鎖定數(shù)據(jù)。

      數(shù)據(jù)庫也是一樣,但顯然要復(fù)雜的多,因?yàn)椴粌H面臨著等值查詢,還有范圍查詢(>、<、between、in)、模糊查詢(like)、并集查詢(or)等等。數(shù)據(jù)庫應(yīng)該選擇怎么樣的方式來應(yīng)對所有的問題呢?我們回想字典的例子,能不能把數(shù)據(jù)分成段,然后分段查詢呢?最簡單的如果1000條數(shù)據(jù),1到100分成第一段,101到200分成第二段,201到300分成第三段......這樣查第250條數(shù)據(jù),只要找第三段就可以了,一下子去除了90%的無效數(shù)據(jù)。但如果是1千萬的記錄呢,分成幾段比較好?稍有算法基礎(chǔ)的同學(xué)會想到搜索樹,其平均復(fù)雜度是lgN,具有不錯的查詢性能。但這里我們忽略了一個關(guān)鍵的問題,復(fù)雜度模型是基于每次相同的操作成本來考慮的。而數(shù)據(jù)庫實(shí)現(xiàn)比較復(fù)雜,一方面數(shù)據(jù)是保存在磁盤上的,另外一方面為了提高性能,每次又可以把部分?jǐn)?shù)據(jù)讀入內(nèi)存來計算,因?yàn)槲覀冎涝L問磁盤的成本大概是訪問內(nèi)存的十萬倍左右,所以簡單的搜索樹難以滿足復(fù)雜的應(yīng)用場景。

      二 磁盤IO與預(yù)讀

      前面提到了訪問磁盤,那么這里先簡單介紹一下磁盤IO和預(yù)讀,磁盤讀取數(shù)據(jù)靠的是機(jī)械運(yùn)動,每次讀取數(shù)據(jù)花費(fèi)的時間可以分為尋道時間、旋轉(zhuǎn)延遲、傳輸時間三個部分,尋道時間指的是磁臂移動到指定磁道所需要的時間,主流磁盤一般在5ms以下;旋轉(zhuǎn)延遲就是我們經(jīng)常聽說的磁盤轉(zhuǎn)速,比如一個磁盤7200轉(zhuǎn),表示每分鐘能轉(zhuǎn)7200次,也就是說1秒鐘能轉(zhuǎn)120次,旋轉(zhuǎn)延遲就是1/120/2 = 4.17ms;傳輸時間指的是從磁盤讀出或?qū)?shù)據(jù)寫入磁盤的時間,一般在零點(diǎn)幾毫秒,相對于前兩個時間可以忽略不計。那么訪問一次磁盤的時間,即一次磁盤IO的時間約等于5+4.17 = 9ms左右,聽起來還挺不錯的,但要知道一臺500 -MIPS(Million Instructions Per Second)的機(jī)器每秒可以執(zhí)行5億條指令,因?yàn)橹噶钜揽康氖请姷男再|(zhì),換句話說執(zhí)行一次IO的時間可以執(zhí)行約450萬條指令,數(shù)據(jù)庫動輒十萬百萬乃至千萬級數(shù)據(jù),每次9毫秒的時間,顯然是個災(zāi)難。下圖是計算機(jī)硬件延遲的對比圖,供大家參考:

      考慮到磁盤IO是非常高昂的操作,計算機(jī)操作系統(tǒng)做了一些優(yōu)化,當(dāng)一次IO時,不光把當(dāng)前磁盤地址的數(shù)據(jù),而是把相鄰的數(shù)據(jù)也都讀取到內(nèi)存緩沖區(qū)內(nèi),因?yàn)榫植款A(yù)讀性原理告訴我們,當(dāng)計算機(jī)訪問一個地址的數(shù)據(jù)的時候,與其相鄰的數(shù)據(jù)也會很快被訪問到。每一次IO讀取的數(shù)據(jù)我們稱之為一頁(page)。具體一頁有多大數(shù)據(jù)跟操作系統(tǒng)有關(guān),一般為4k或8k,也就是我們讀取一頁內(nèi)的數(shù)據(jù)時候,實(shí)際上才發(fā)生了一次IO,這個理論對于索引的數(shù)據(jù)結(jié)構(gòu)設(shè)計非常有幫助。

      MySQL Python SQL 數(shù)據(jù)庫

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:【云駐共創(chuàng)】淺談物聯(lián)網(wǎng)初識入門
      下一篇:excel2003取消只讀模式的教程
      相關(guān)文章
      亚洲免费一级视频| 亚洲∧v久久久无码精品| 亚洲一本之道高清乱码| 亚洲美女视频网址| 91精品国产亚洲爽啪在线观看| 亚洲国产婷婷六月丁香| 亚洲精品无码不卡在线播HE | 激情亚洲一区国产精品| 亚洲国产高清美女在线观看| 亚洲无线一二三四区| 亚洲国产精品美女| 亚洲a∨无码男人的天堂| 亚洲成a人片在线观看精品| 日本亚洲免费无线码| 亚洲人成色777777老人头| 亚洲欧美成aⅴ人在线观看| 亚洲精品无码专区在线播放| 亚洲avav天堂av在线网毛片| www国产亚洲精品久久久| 亚洲视频在线免费| 亚洲精品无码乱码成人| 亚洲V无码一区二区三区四区观看| 亚洲AV人无码综合在线观看| 亚洲视频在线播放| 亚洲一区二区三区免费观看| 亚洲一区在线视频| 亚洲乱色熟女一区二区三区蜜臀| 亚洲精品av无码喷奶水糖心| 国产亚洲精品欧洲在线观看| 亚洲午夜无码AV毛片久久| 亚洲综合国产一区二区三区| 人人狠狠综合久久亚洲88| 久久精品国产亚洲AV大全| 亚洲乱人伦精品图片| 亚洲码欧美码一区二区三区| 亚洲高清免费视频| 亚洲av永久无码精品漫画 | 亚洲狠狠久久综合一区77777| 亚洲日韩乱码中文无码蜜桃臀| 亚洲综合激情五月丁香六月| 日韩亚洲精品福利|