处理字典值是把字典放内存还是用sql处理_SQL索引及其底层实现
準備?1、對關系型數據庫有基本的了解
??? 2、對樹,平衡二叉樹有了解。
目錄
一、什么是索引以及為什么要用索引
二、索引的分類
三、實現原理
四、物理存儲
五、索引的優化
?在實際的面試中,遇到數據庫的問題大致有事務、鎖、索引、以及SQL調優等方面的問題。
索引算是一個比較基礎的知識點了,以下以MySQL為例,談談數據庫的索引。
什么是索引
?簡單來講,索引是將數據庫中的記錄按照某個特殊的格式存儲的數據結構。通過索引,能夠顯著提高查詢效率,從而提高服務器的性能。
?數據庫中的索引類似我們書籍、字典的索引,我們通過,例如我們想查字【紅】【hong】我們可以利用字典的拼音表去查對應【hong】的頁數,然后直接找到改頁,對比所有的哄、鴻、宏、紅,最后找出我們所需要的數據。但是一般我們查字典都不用拼音表,或者偏旁表,而是直接去翻頁數,比如說先翻到【N】,再翻到【F】,再翻到【I】,最后我們很快地找到了對應的【H】。
為什么要是用索引
?這個問題等價于,索引的好處:
1、避免全表掃描。有了索引,我們通過索引存放的物理地址或者偏移地址也好去對應的內存,磁盤中去尋找,大大節約了時間,不然只能遍歷全表掃描了。2、減少排序、臨時表的建立以主鍵索引為例子,一般我們設置主鍵自增,當我們利用索引找到數據,由于索引本身是有序的,找出來的數據也自然是有序的,這點如果底層是hash表實現的,則無序。可以將無序IO變成有序IO。
索引的缺點:
索引本身是以表的形式存儲的,自然會占用內存空間講到這里,一般的磁盤格式化,也是刪除索引,而不是刪除原數據,所以磁盤格式化了,恢復數據也不是什么難事,只要原來的數據沒有被從新覆蓋。刪除,添加,修改數據時,也要修改索引
所以,當一個表的數據量很小時,或者刪除、插入頻率遠高于查找,不使用索引的成本要低些。
索引的分類
?一般可以分為單列、組合、全文索引和空間索引。用的最多的是單列索引和組合索引。
主鍵索引
不為空,唯一
ALTER 'TABLE_NAME' ADD PRIMARY PK_TABLE_NAME('COL_ONE');唯一索引
唯一,可為空
ALTER 'TABLE_NAME' ADD UNIQUE unique_name('COL_ONE');普通索引
ALTER 'TABLE_NAME' ADD INDEX iINDEX_ONE('COL_ONE');組合索引
ALTER TABEL_NAME ADD INDEX INDEX_NAME('COL_ONE', 'COL_TWO', 'COL_THREE');組合索引,會遵循最左配對原則,一言以蔽之,會優先走第一個索引。相當于創建了三個索引。
INDEX_ONE('COL_ONE')
INDEX_TWO('COL_ONE','COL_TWO')
INDEX_THREE('COL_ONE', 'COL_TWO', 'COL_THREE')
底層實現
哈希索引
通過對鍵值進行哈希運算,將哈希出來的hashCode存放在散列表中,而對應的散列表存放對應數據行的地址或者下一級地址。
| 學號 | 姓名 | 分數 |
|---|---|---|
| 101 | 李華 | 90 |
| 102 | 小明 | 93 |
| 103 | 小芳 | 98 |
| 104 | 張三 | 99 |
| 105 | 趙四 | 100 |
同時,可以看出,當出現哈希沖突,我們是用鏈地址法,將沖突的行的地址放在下一行中。例如:
李華和趙四出現沖突,我們先得出李華hashCode,將其地址,存放在散列表中。但是趙四得出和李華一樣的hashCode,通過對比起存放的地址,發現已存數據,這樣我們把存放李華對應行的頭部解放出來,存放指向下一行的地址。
B樹索引
B樹實際上是一種多叉平衡搜索樹,那么為什么在大型的文件系統或者數據庫,為什么不用紅黑樹或者哈希表:
紅黑樹,樹的高度很高,訪問文件系統時,需要多次IO操作,而在服務器相應的過程中,相比于CPU處理速度和內存讀取速度,磁盤IO是非常緩慢的
會出現哈希沖突,從而也需要遍歷鏈地址。
一般來說,索引本身也是很大的,比如2個G的文件,索引就要占1/3,是沒辦法一下子載入內存的。為了解決以上問題,在我們學的操作系統里面,有一個磁盤分頁和局部性原理,這里就不展開了。
B 樹的特點:
(1) 樹的高度是平衡的,所有的葉子結點都在同一層。
(2)更新和檢索只會影響到一些磁盤,因此性能穩定。
(3)把相關的記錄存儲在同一個磁盤,可以可以利用局部性原理進行預讀。
(4)非葉子結點的key都是[key, data]的二元組,key為索引的鍵,data為當前的數據行。
一個m階B樹的定義
根或者葉子結點至少有兩個孩子。
除了根以外,每個內部結點至少有m/2的上限到m個孩子。
所有的葉子結點都在同一層,不不含任何信息(可以看成外部節點或者查找失敗的結點)。
B樹的示意圖:
為一個3階B樹,也就是說每一個結點【非根】最多有三個孩子,最少有2個孩子。
每個結點內部為
B 樹的插入
找到可以插入的最下層內部結點,如果結點的孩子數小于m,直接插入,否則將當前結點一分為二,并將中間的關鍵字,提到父節點,父節點也按如上邏輯執行。
B+ 樹
談B+ 樹,肯定要說B樹的缺點:
無法處理范圍查詢,由于B樹沒有順序索引,也沒有鏈地址,所取出來的地址都是離散的。
無法定位到指定的行。我個人的理解是B樹中的key存儲的是[key, data]二元組,如果所有的索引都要存數據,定位到指定的行,難免數據量太大了。
B+樹定義
對于一個m階B+樹:
所有節點的key值個數等于孩子個數,最下層的內存節點包含了所有的關鍵字,所有非最下層的內部結點的關鍵字個數是對應子樹的最大關鍵字個數。
每一個結點有m/2的上限到m個孩子。
所有的葉子結點都在同一層,且不含任何信息(可以看錯外部節點或查詢失敗。)
每個最下層的內部結點都帶一個指針,指向相鄰的結點。形成了帶順序索引的B樹。
物理存儲
雖然說不同的存儲引擎都是用的B樹,但是具體實現還是有區別的,InnoDB實現的是聚族索引,MyISAM實現的是非聚族索引。
主鍵索引和輔助索引
B+樹的非葉子結點存儲的是鍵值,當鍵值是主鍵時,為主鍵索引,其他的為輔助索引。
聚族索引
主鍵索引的最下層葉子結點存儲鍵值對應的數據本身,非主鍵索引存儲對應數據段的【該行數據】的主鍵值。?也就是說,通過主鍵索引,可以直接找到對應的數據行,而輔助索引是先找到對應數據行的主鍵,然后再用主鍵索引去找數據。
?假設有一個數據表,如下:
?對應的聚族索引的主鍵和輔助索引為:
非聚族索引
?非聚族索引就沒那么復雜了,主鍵和輔助索引的葉子結點都是存儲著對應的物理地址(ROWID ??),除了主鍵索引不能為空,且唯一。
索引優化
SQL 調優這塊其實學問很大,很多面試官都會問,簡單列幾條:
最左原則
覆蓋索引。也就是說,盡量使用所有需要查詢的字段來做索引。這樣就無須再去掃描對應的行了。(扯淡)
索引排序 用對應的索引查出來的數據就可以排序,因為索引也是有序的。
索引不要參與計算 最簡單的一個例子,就是你的索引就是對應hash的一個值,最好不要計算,那樣就不走索引了。
總結
以上是生活随笔為你收集整理的处理字典值是把字典放内存还是用sql处理_SQL索引及其底层实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 求一个卖服装微信个性签名。
- 下一篇: python用for循环一直出现最后一个