一、區分幾個概念
1、頁
1、頁號:記錄當前是第幾頁。
2、頁目錄:記錄行數據,標記行開始的最小主鍵索引數據。
3、行數據:標識每一行的數據。1_111a 標識第一行數據,1_表示主鍵索引。
行與行數據使用鏈表有序相連。
4、一頁數默認爲16k,並且會指向下一頁的地址。
2、b+樹
多個頁相互連接在一起,爲了方便查找會再向上生成一個新的類似頁的東西,記錄頁碼和每頁最小的主鍵索引,按照這個思路就會生成一顆樹,這就是一個b+樹。
3、回表,如果是一個聚集索引(abc),在最下面的葉子節點存儲的不會是真實數據,而是對應的主鍵索引,所以如果查詢的時候查的數據並非abcd這四個字段,比如查詢的是abcde,就需要回表根據主鍵id繼續查詢。
select a,b,c,d,e from X where a=1 and b=2 and c=3 and d=e; 是不能利用索引的。
select a,b,c from X where a>1; 是不能利用索引的,因爲回表的話會全表掃描。
查詢過程會先查詢a=1,找到數據後查詢後續所有數據。
select a,b,c from X where a>7; 可能會利用索引,因爲mysql優化器認爲即使回表返回的數據不會很多,效率比全表掃描高一些。
4、如何建立索引
① 索引選擇:選擇性 = 不重複的記錄數 / 總記錄數
選擇性的取值範圍爲(0, 1],選擇性越高的索引價值越大。如果選擇性等於1,就代表這個列的不重複值和表記錄 數是一樣的,那麼對這個列建立索引是非常合適的,如果選擇性非常小,那麼就代表這個列的重複值是很多的, 不適合建立索引。
② 最左前綴原則
③ 1>索引列的類型儘量小
2>利用索引字符串值的前綴
3>主鍵自增
4>定位並刪除表中的重複和冗餘索引
5>儘量使用覆蓋索引進行查詢,避免回錶帶來的性能損耗。