1. 索引
索引:是排好序的數據結構。很重要這句話
以至於有一個索引是 (“name”,"age")的話
查詢語句是
select age from student where age = 1 是不會進入索引的,因爲底層索引是排好序的
索引底層如果因爲的BTree的話就會按照索引創建順序,依次排序
2.B-Tree和B+Tree的區別
B+Tree是B-Tree改進版,適用於Mysql,
B+Tree中的非葉子節點的data移動到葉子節點,但是B-Tree是存在Data,不存在Data可以節省空間,存儲更多非葉子節點
B+Tree葉子節點之間是從左到右依次遞增排好序的,葉子節點之間是有相互指針箭頭的,主要改進是爲了範圍查找
二叉樹和紅黑樹(二叉平衡樹)的高度不可控
B+Tree第一層非葉子節點是常駐磁盤的
3.存儲引擎
存儲引擎是形容數據庫表的,表信息是存儲在本地磁盤上的
一. MylSAM存儲引擎:索引文件和數據庫文件是分離的(非聚集)
MylSAM是表級鎖,所以對寫操作不友好
本地磁盤存儲表的時候有三個文件夾
frm:表結構相關信息 MYD :MylSAM + data數據的簡寫 MYI : MylSAM + index的簡寫
查詢步驟:舉例COL1 = 1
第一步:先檢查COL1是否是索引字段
第二步:在MYI中查找索引文件,找到磁盤地址
第三步:根據磁盤地址找到MYD文件中對應的主鍵從而找到對應的數據
二.InnoDB引擎 (聚集)
InnoDB是行級鎖,對寫友好,查詢慢,支持事務
本地磁盤存儲表的時候有兩個文件
frm:表結構相關信息 idb : index + data
查詢步驟:舉例COL1 = 1
第一步:先檢查COL1是否是索引字段
第二步:在idb中查找索引文件和數據文件
既是索引未見也是數據文件,在ibd就可以查找
聚集索引,葉節點包含了完整的數據記錄
4. 問題彙總及解答
一,不建立多個單值索引
二,索引最左前綴原則:不能裏哦啊過任何一個值,只能從第一個開始用,從第二個是不走索引的,原因是索引都是排好序的數據結構,從第二個開始查詢就不是排好序的了
三,聚集索引:葉節點包含數據+索引 (一個文件中查詢)
非聚集索引:葉節點只包含索引:兩個文件中查詢,數據和索引是分開的
四:InnoDB表必須建立主鍵,並推薦使用整形的自增類型
設計如此,如果沒有主鍵會自己找一列,當前列的數據是不重複的,會作爲默認主鍵,如果沒有會建立隱藏列增加磁盤壓力。
自增的整型是因爲會經歷比大小,整型比較快,省時間和內存,佔用存儲空間比較小,效率比較高
五,爲什麼非主鍵的索引結構葉子節點存儲的是主鍵值
一致性得到保證,而且節省存儲空間
六,爲什麼索引用B+tree而不用Hash的原因
因爲範圍查找。