為什麼b+tree把data都移到葉子節點,並且增加雙向鍊錶?(b+tree比b-tree的改進)將data移動到葉子節點,非葉子節點儲存的索引數變多,在高度相等的情況下,能儲存的data更多,查詢效率自然就高了
為什麼使用b+tree而不使用紅黑樹或者跳表按資料結構分:區域性性原理:資料和程式都有聚集成群的侵向。之前被讀取過的資料,很可能很快被下一次讀取
磁碟預讀原理:記憶體和磁碟互動的基本單元是頁,每次讀取都是頁的整數倍
最最主要的問題是和作業系統中磁碟的i/o有關。資料庫利用了磁碟預處理原理,將單個節點設定為頁的整數倍的大小(磁碟儲存的基本單位),每次讀取乙個節點就相當於一次i/o操作。b+tree讀取乙個節點所需要載入的節點個數比紅黑樹,跳表要少的多(紅黑樹和跳表載入乙個節點需要載入很多父節點),並且b+tree的根節點載入後的重複利用率也高
按邏輯分:
聯合索引
按物理儲存分:
聚集索引
非聚集索引索引不是越多越好
不要在經常變動的資料加索引(尤其是update),維護起來非常複雜
小資料量的表不需要加索引
索引一般加在常用來查詢的字段上
乙個資料夾對應乙個資料庫
table.frm 表定義資訊
table.ibd 資料和索引的儲存 (innodb儲存引擎)
table.myd 資料儲存
table.myi 索引儲存
儲存引擎是形容資料庫表的!!
為什麼innodb的表必須要建主鍵?儲存引擎對比如果innodb表沒有建主鍵,則mysql會自動為表新增主鍵。
innodb是根據主鍵組織的乙個索引結構檔案,所以必須有主鍵
為什麼innodb推薦使用整形的自增主鍵?
在根據索引查詢時,會跟索引進行大小的比較,整形適合大小的比較,而uuid效率低
整形占用記憶體必uuid要小的多,節約成本(主要是占用執行時記憶體的空間)
並且整形自增對insert語句帶來的維護索引的成本要低,insert語句執行也會更快
儲存引擎
innodb
myisam
事務支援
支援不支援
資料行鎖定
支援不支援(是用表鎖)
外來鍵約束
支援不支援
全文索引
不支援支援
表空間大小
較大約為myisam的倆倍
較小索引
主鍵索引採用聚集索引,輔助索引的data存主鍵的值
主索引和輔助索引一樣,data全是存位址 ,但是主索引的值唯一
memory
常規使用操作:對查詢頻率高,資料量比較大的建立索引
索引字段經常選擇 where子句中最常用,過濾效果最好的
使用唯一索引,區分度越高,使用索引的效率越高
索引不是多多益善,對增刪改比較頻繁的表,不要建立索引
使用最左字首,n個列組合而成的組合索引,相當於是建立了n個索引,如果where子句中使用了索引的前幾個字段,則可以用此來提高效率
回表:
深入了解MySQL的索引
一 關於儲存引擎 建立合適的索引是sql效能調優中最重要的技術之一。在學習建立索引之前,要先了解mysql的架構細節,包括在硬碟上面如何組織的,索引和記憶體用法和操作方式,以及儲存引擎的差異如何影響到索引的選擇。myisam一種非事務性的儲存引擎,是mysql 5.5之前版本預設的儲存引擎。inno...
深入了解MySQL的索引
一 關於儲存引擎 建立合適的索引是sql效能調優中最重要的技術之一。在學習建立索引之前,要先了解mysql的架構細節,包括在硬碟上面如何組織的,索引和記憶體用法和操作方式,以及儲存引擎的差異如何影響到索引的選擇。myisam 一種非事務性的儲存引擎,是mysql 5.5之前版本預設的儲存引擎。inn...
深入理解mysql索引 深入了解mysql索引
1 索引原理 索引被用來快速找出在乙個列上用一特定值的行。沒有索引,mysql不得不首先以第一條記錄開始,然後讀完整個表直到它找出相關的行。表越大,花費時間越多。對於乙個有序字段,可以運用二分查詢 binary search 這就是為什麼效能能得到本質上的提高。myisam和innodb都是用b t...