mysql 动态索引_MySQL的索引
在日常工作中,我們經常會用到mysql的索引。使用索引的目的基本上就是為了在大量的數據中快速找出某個列中一個特定值的行,簡單說就是提高查詢效率。
使用索引的優點:
可以快速檢索,減少I/O次數,加快檢索速度;
根據索引分組和排序,可以加快分組和排序。
當然索引也有缺點:
索引是數據結構,索引是存儲在表中的,創建索引和維護索引需要時間,而且數據量越大時間越長
創建索引需要占據磁盤的空間,如果有大量的索引,可能比數據文件更快達到最大文件尺寸
當對表中的數據進行增加,修改,刪除的時候,索引也要同時進行維護,降低了數據的維護速度
索引的分類:
常見的索引類型有:主鍵索引、唯一索引、普通索引、全文索引、組合索引
普通索引(Normal):基本索引類型,允許在定義索引的列里插入空值或重復值。
唯一索引(Unique):索引列值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須唯一。
主鍵索引是一種特殊的唯一索引,不允許有空值
單列索引:只包含一個列的索引,一個表中可以有多個
組合索引:包含多個列的索引,查詢條件包含這些列的最左邊的字段的時候,索引就會被引用,遵循最左綴原則
全文索引:用大文本對象的列構建的索引
索引的設計原則:
首先索引并不是不是越多越好,而且對于常更新的表索引越少越好。
數據量小的表最好不要建立索引
不同的值比較多的列才需要建立索引
某種數據本身具備唯一性的時候,建立唯一性索引,可以保證定義的列的數據完整性,以提高查詢熟度
頻繁進行排序或分組的列(group by或者是order by)可以建立索引,提高搜索速度
經常用于查詢條件的字段應該建立索引
索引需要占用磁盤空間,因此在創建索引時要考慮到磁盤空間是否足夠。而且創建索引時需要對表加鎖,因此實際操作中需要在業務空閑期間進行。
索引的實現原理:
Mysql本身支持多種存儲引擎,所以可以支持多種索引。如BTree索引,哈希索引,全文索引等。mysql默認存儲引擎innodb只顯式支持B-Tree( 從技術上來說是B+Tree)索引,對于頻繁訪問的表,innodb會透明建立自適應hash索引,即在B樹索引基礎上建立hash索引,可以顯著提高查找效率,對于客戶端是透明的,不可控制的,隱式的。
B+樹索引是B+樹在數據庫中的一種實現,是最常見也是數據庫中使用最為頻繁的一種索引。B+樹中的B代表平衡(balance),而不是二叉(binary),因為B+樹是從最早的平衡二叉樹演化而來的。二叉樹具有以下性質:左子樹的鍵值小于根的鍵值,右子樹的鍵值大于根的鍵值。比如:
對該二叉樹的節點進行查找發現深度為1的節點的查找次數為1,深度為2的查找次數為2,深度為n的節點的查找次數為n,因此其平均查找次數為 (1+2+2+3+3+3) / 6 = 2.3次。但是顯然對于這種:
對這種二叉樹而言查詢效率就要低很多,特別是查找最底層的葉子節點的時候。所以要想要這個二叉樹的查詢效率高,就得需要這棵二叉樹盡量是平衡的。對于平衡二叉樹而言,他不僅滿足二叉樹的性質,而且還滿足任何節點的兩個子樹的高度最大差為1。比如:
BTree是平衡搜索多叉樹,是為磁盤等外存儲設備設計的一種平衡查找樹。系統從磁盤讀取數據到內存時是以磁盤塊(block)為基本單位的,位于同一個磁盤塊中的數據會被一次性讀取出來,而不是需要什么取什么。
InnoDB存儲引擎中有頁(Page)的概念,頁是其磁盤管理的最小單位。Innodb默認每頁大小為16k。而系統一個磁盤塊的存儲空間往往沒有一頁那么大,因此InnoDB每次申請磁盤空間時都會是若干地址連續磁盤塊來達到頁的大小。InnoDB在把磁盤數據讀入到磁盤時會以頁為基本單位,在查詢數據時如果一個頁中的每條數據都能有助于定位數據記錄的位置,這將會減少磁盤I/O次數,提高查詢效率。
BTree結構的數據可以讓系統高效的找到數據所在的磁盤塊。B樹是一種多路自平衡搜索樹,它類似普通的二叉樹,但是B樹允許每個節點有更多的子節點。有如下特點
所有鍵值分布在整個樹中
任何關鍵字出現且只出現在一個節點中
搜索有可能在非葉子節點結束
在關鍵字全集內做一次查找,性能逼近二分查找算法
如下圖所示為一個3階的B-Tree
比如要查找位于磁盤8上的28 。從根節點開始先找到磁盤1,讀入內存,通過比較關鍵字28找到磁盤1的指針p2。在根據p2找到磁盤3,讀入內存,再通過比較關鍵字找到磁盤3上的指針p2.根據p2找到磁盤8讀入內存,通過比較找到關鍵字28.由于根節點常駐內存,整個過程只是進行了2次的磁盤io操作。
B+樹是在btree基礎上進行的一種優化。區別如下:
B+Tree中的非葉子結點不存儲數據,只存儲鍵值;
B+Tree的葉子結點沒有指針,所有鍵值都會出現在葉子結點上,且key存儲的鍵值對應data數據的物理地址
結構圖如下:
Mysql默認innodb存儲引擎就是使用B+樹來實現索引結構的。由于內節點(非葉子節點)不存儲data,所以一個節點可以存儲更多的內節點,每個節點能索引的范圍更大更精確。也就是說使用B+樹單次磁盤IO的信息量相比較B樹更大,IO效率更高。一般實際應用中,度d是非常大的數字,通常超過100,因此h非常小(通常不超過3,也即索引的B+樹層次一般不超過三層,所以查找效率很高)。
總結
以上是生活随笔為你收集整理的mysql 动态索引_MySQL的索引的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【FlexSim2019】仿真软件入门笔
- 下一篇: linux cmake编译源码,linu