之前在學習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