mysql索引(一)索引的原理

之前在學習mysql的時候,對索引有了初步的了解。

但是,了解的不是很透,比如說,當時我就不知道,索引其實是一個數據結構。

一:索引介紹

1:為何要有索引?

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

2:什么是索引?

索引在MySQL中也叫做“鍵”或者"key"(primary key,unique key,還有一個index key),是存儲引擎用于快速找到記錄的一種數據結構。索引對于良好的性能非常關鍵,尤其是當表中的數據量越來越大時,索引對于性能的影響愈發重要,減少io次數,加速查詢。(其中primary key和unique key,除了有加速查詢的效果之外,還有約束的效果,primary key 不為空且唯一,unique key 唯一,而index key只有加速查詢的效果,沒有約束效果)
索引優化應該是對查詢性能優化最有效的手段了。索引能夠輕易將查詢性能提高好幾個數量級。
索引相當于字典的音序表,如果要查某個字,如果不使用音序表,則需要從幾百頁中逐頁去查。

強調:一旦為表創建了索引,以后的查詢最好先查索引,再根據索引定位的結果去找數據

3:對索引的誤解

(1):索引時不必越多越好,添加索引對查詢會提高速度,對寫入及刪除會較低效率。因此需要找到一個創建索引的平衡點
(2):索引太多,會影響磁盤的使用率,盡量刪除一些不必要的索引。

二:索引的原理

1:索引的原理

索引就相當于是一本字典的查找目錄。我們可以根據拼音查找,我們也可以根據偏旁部首之類的查找。

下面內容看不懂的同學也沒關系,能明白上邊這個目錄的道理就行了。 那么你想,書的目錄占不占頁數,這個頁是不是也要存到硬盤里面,也占用硬盤空間。你再想,你在沒有數據的情況下先建索引或者說目錄快,還是已經存在好多的數據了,然后再去建索引,哪個快,肯定是沒有數據的時候快。

因為如果已經有了很多數據了,你再去根據這些數據建索引,是不是要將數據全部遍歷一遍,然后根據數據建立索引。你再想,索引建立好之后再添加數據快,還是沒有索引的時候添加數據快,索引是用來干什么的,是用來加速查詢的,那對你寫入數據會有什么影響,肯定是慢一些了,因為你但凡加入一些新的數據,都需要把索引或者說書的目錄重新做一個,所以索引雖然會加快查詢,但是會降低寫入的效率。

2:索引的影響

1、在表中有大量數據的前提下,創建索引速度會很慢
2、在索引創建完畢后,對表的查詢性能會發幅度提升,但是寫性能會降低

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

這里大概解釋一下:

數據庫也是一樣,但顯然要復雜的多,因為不僅面臨著等值查詢,還有范圍查詢(>、<、between、in)、模糊查詢(like)、并集查詢(or)等等。

數據庫應該選擇怎么樣的方式來應對所有的問題呢?我們回想字典的例子,能不能把數據分成段,然后分段查詢呢?最簡單的如果1000條數據,1到100分成第一段,101到200分成第二段,201到300分成第三段......這樣查第250條數據,只要找第三段就可以了,一下子去除了90%的無效數據。

但如果是1千萬的記錄呢,分成幾段比較好?稍有算法基礎的同學會想到搜索樹,其平均復雜度是lgN,具有不錯的查詢性能。但這里我們忽略了一個關鍵的問題,復雜度模型是基于每次相同的操作成本來考慮的。

而數據庫實現比較復雜,一方面數據是保存在磁盤上的,另外一方面為了提高性能,每次又可以把部分數據讀入內存來計算,因為我們知道訪問磁盤的成本大概是訪問內存的十萬倍左右,所以簡單的搜索樹難以滿足復雜的應用場景。

3:磁盤IO讀取

這個涉及到部分硬件的原理,這個不了解無所謂,只需要知道,磁盤I/O是很耗費資源和時間的,而且磁盤I/O是有瓶頸的。

考慮到磁盤IO是非常高昂的操作,計算機操作系統做了一些優化,當一次IO時,不光把當前磁盤地址的數據,而是把相鄰的數據也都讀取到內存緩沖區內,因為局部預讀性原理告訴我們,當計算機訪問一個地址的數據的時候,與其相鄰的數據也會很快被訪問到。每一次IO讀取的數據我們稱之為一頁(page)。

具體一頁有多大數據跟操作系統有關,一般為4k或8k,也就是我們讀取一頁內的數據時候,實際上才發生了一次IO,這個理論對于索引的數據結構設計非常有幫助。

以上大概就是索引的原理部分的概念,文字稍多,但是基本上都是有例子解釋。

索引這部分其實重在理解其原理,才能更好的使用。

索引的基本語法請移步《mysql(二十二)之索引基礎語法及使用》

有好的建議,請在下方輸入你的評論。

歡迎訪問個人博客
https://guanchao.site

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容