1、數據庫中最常見的慢查詢優化方式是什麼?
加索引
2、爲什麼加索引能優化慢查詢?
索引其實是一個數據結構,B+樹。
B+樹
一個m階的B+樹具有如下幾個特徵:
1.有k個子樹的中間節點包含有k個元素(B樹中是k-1個元素),每個元素不保存數據,只用來索引,所有數據都保存在葉子節點。
2.所有的葉子結點中包含了全部元素的信息,及指向含這些元素記錄的指針,且葉子結點本身依關鍵字的大小自小而大順序鏈接。
3.所有的中間節點元素都同時存在於子節點,在子節點元素中是最大(或最小)元素。
B+樹的優勢:
1.單一節點存儲更多的元素,使得查詢的IO次數更少。
2.所有查詢都要查找到葉子節點,查詢性能穩定。
3.3.所有葉子節點形成有序鏈表,便於範圍查詢。
3、你知道哪些數據結構可以提高查詢速度?
哈希表、完全平衡二叉樹、B+樹。
4、那這些數據結構既然都能優化查詢速度,mysql爲何選擇用B+樹?
一個節點裏面可以存多個元素:磁盤IO
元素有冗餘+葉子節點之間有指針:範圍查找
B+樹的優勢(見上面)
5、爲什麼一個節點爲1頁(16K)就夠了?
假如有個高度爲2的B+樹:
result = 葉子節點數 * 一個葉子節點裏能存放的數據條數
葉子節點數 = 根節點的指針數 = {索引值+ 指針}組合數 = 索引值個數
假設一行數據的大小-=1KB(合理的值)
一個葉子節點能夠存放的數據條數?16KB / 1KB = 16條
索引值個數?16KB / {int類型索引值8B + 指針6B} (14B) = 16KB / 14B = 1170
result = 1170*16=18720
B+樹高度爲2 : 1170*16=18720
B+樹高度爲3: 1170 * 1170 * 16 = 21902400
6、mysql兩種存儲引擎下的B+樹使用
InnoDB中的B+樹:
InnoDB種主鍵索引的葉子節點的數據區域存儲的是數據記錄,輔助索引存儲的是主鍵值:
輔助索引:
MyISAM中的B+樹:
MYISAM中葉子節點的數據區域存儲的是數據記錄的地址。
7、B+樹 VS B樹:
B+樹的非葉子節點不存儲數據,只有葉子節點才存儲數據;
而B樹的非葉子節點和葉子節點都會存儲數據,會導致非葉子節點存儲的索引值
會更少,樹的高度相對會比B+樹高,平均的I/O效率會比較低,所以使用B+樹作
爲索引的數據結構。
再加上B+樹的葉子節點之間會有指針相連,也方便進行範圍查找。
8、InnoDB總結:
InnoDB中的主鍵索引和實際數據是綁定在一起的,也就是說InnoDB的一個表一
定要有索引,如果一個表沒有手動建立主鍵索引,InnnoDB會查看有內有唯一索
引,如果有則選用唯一索引作爲主鍵索引,如果連唯一索引也沒有,則會默認建
立一個隱藏的主鍵索引(用戶不可見)。
另外,InnoDB的主鍵索引要比MyISAM的主鍵索引查詢效率要高(少一次磁盤IO),並且比輔助索引也要高很多。
所以,我們在使用InnoDB作爲存儲引擎時,我們最好:
1、手動創建主鍵索引
2、儘量利用主鍵索引查詢
9、到底什麼是索引?
大學老師定義:索引就像是輸的目錄。
mysql官網定義:indexes are used to find rows with specific column values quickly.
簡單理解:索引是一種優化查詢的數據結構。
10、 MySQL總結:
B+樹可以更好的結合磁盤IO原理,提高查詢效率。
Innodb一定要有主鍵,沒有主鍵以唯一索引爲主鍵,否則會建立一個隱藏主鍵
Innodb的數據是和主鍵索引存在一起的(數據在葉子節點中,MyISAM的葉子
結點數據區域存儲的是數據地址)
建立索引時要考慮已有索引,一個sql語句只會選擇花費最低的一個索引執行
索引是一種有序的數據結構(B+樹),一個節點可以存多個有序的元素,所
以要利用好最左前綴原則。
11、MySQL索引的本質
索引是一種有序的數據結構
12、mysql索引的底層原理
B+樹實現,具體見上面描述。
PS:一般來說,索引本身也很大,不可能全部存儲在內存中,因此索引往往以
索引文件的形式存儲的磁盤上。