mysql引擎
- 物理存儲格式 compact: SHOW TABLE STATUS
存疑
- 每一次插入數據時,是不是都要重新對所有的索引樹設置?
- 葉子節點的數據時保存在哪裏的,內存中?如果沒有找到數據,要如何去磁盤中獲取數據?獲取之後,是不是有時間有效期,有效期過了,就將該部分內存釋放?
- 如果全表查詢,數據都加載到內存中?
查詢的時候,先把磁盤的數據加載到bufferPool緩存,然後更新的時候,更新bufferPoll,同時維護一堆鏈表,然後定時或者不定時的根據flush和lru鏈表,將bufferPool裏的更新過的髒數據刷新到磁盤上
- 數據插入的時候,是如何存放磁盤的?將相鄰的key值存放在一起,之前的數據進行移動?
爲什麼要用B+樹進行mysql索引設計呢?
- 1.B+tree能很好的利用操作系統和磁盤的交互特性,mysql將頁設置爲16k,一次io就可以將一個節點(16K)的內容加載到內存中,比如,假設關鍵字爲int類型,則可以大約存儲(16*1000)/8=2000個關鍵字,3層高度可以搜索的關鍵字個數遠遠大於二叉樹
- 2.B+樹保證樹的平衡的過程中,每次關鍵字的變化,都會導致結構發生很大的變化,所以要創建合適的索引
- 3.只有葉子節點才保存數據,其他的節點不保存數據
- 4.查詢速度更穩定,天然具備排序功能,全節點遍歷更快
MyIsam
- 非聚集索引
- 使用的是B+樹創建索引,葉子節點保存的是磁盤的地址
- 可以沒有主鍵
- 每一個索引都是一顆樹
- 相比Innodb來說,性能好於非主鍵索引
Innodb
- 聚集索引
- 使用的是B+樹索引,葉子節點保存的是實際的數據
- 主鍵索引創建樹,非主鍵索引構建一棵葉子節點爲主鍵的樹,通過找到主鍵,然後再主鍵索引樹中查找
- 注意事項:
1.索引越離散越好
2.不要創建冗餘的索引,儘量的擴展索引,而不是創建索引 3.最小的主鍵空間,空間越小,則每個節點保存的關鍵字數據就越多 4.儘量的採用指定列,而不是select * 5.最左匹配原則