MySQL索引知识复习
在你享受工作舒適的同時,你的危機也已經在慢慢靠近
正確的創建合適的索引才是保證數據庫性能保證的基礎
1、索引的底層數據結構:hash,b樹,b+樹的區別,逐層分析為什么最后選用了b+樹作為索引結構?
Mysql數據庫索引的實現算法是基于B+樹實現的。
數據庫中數據查找的過程:MySQL 是基于磁盤的數據庫系統,索引往往以索引文件的形式存儲的磁盤上,索引查找過程中就要產生磁盤I/O消耗,相對于內存存取,I/O存取的消耗要高幾個數量級,索引的結構組織要盡量減少查找過程中磁盤I/O的存取次數。
局部性原理與磁盤預讀
由于磁盤的存取速度與內存之間鴻溝,為了提高效率,要盡量減少磁盤I/O.磁盤往往不是嚴格按需讀取,而是每次都會預讀,磁盤讀取完需要的數據,會順序向后讀一定長度的數據放入內存。而這樣做的理論依據是計算機科學中著名的局部性原理:
當一個數據被用到時,其附近的數據也通常會馬上被使用 程序運行期間所需要的數據通常比較集中由于磁盤順序讀取的效率很高(不需要尋道時間,只需很少的旋轉時間),因此對于具有局部性的程序來說,預讀可以提高I/O效率.預讀的長度一般為頁(page)的整倍數。
如果要使查詢效率提高,我們就得想辦法減低樹的層級高度,樹的層級高度越低,查詢速度就越快
- 二叉樹:基本上都遵循左小右大的原則,最上層節點稱之為跟節點,最下面的節點稱之為葉子節點,也叫葉節點,中間的節點稱之為枝節點
- B樹:二叉樹的每個葉子結點只存儲一個元素,導致樹的高度太高,因此讓一個節點存儲多個元素,降低樹的整體層級高度,從而減少少磁盤訪問次數,優化查詢速度
| 數據結構 | 特點 |
| B樹 | 四路查找B樹,何為四路,即每個節點中儲存的元素數量數,也稱為關鍵字數 1、非葉子節點的子節點數大于1,且小于或等于M,并且M大于1 2、所有子節點都是處于同一層級 3、非葉子節點里記錄關鍵字、關鍵字的磁盤記錄指針、指向其子節點指針 4、葉子節點里記錄里關鍵字及關鍵字的磁盤記錄指針,子節點指針為null 缺點:B樹的子節點里記錄里關鍵字及關鍵字的磁盤記錄指針并且還有指向其子節點指針。當數據量很大時,整棵樹的體量也會很大,每次讀取到內存中的樹的信息就會很大,消耗資源 |
| B+樹 | B樹和B+樹,本質上都是一樣的 1、B+樹所有的根節點和枝節點上只保存關鍵字索引和其子節點指針2、所有的數據信息都被保存到了葉子節點,這樣每個枝節點可以存儲更多的數據,從而降低樹的層級高度, 3、所有葉子節點像是一個鏈表一樣,指向右邊的葉子節點,從而可以有效加快檢索效率 4、如果需要遍歷所有的數據,只需要遍歷葉子節點鏈式結構即可 |
為什么使用 B+樹
B+樹更適合外部存儲,由于內節點無 data 域,一個結點可以存儲更多的內結點,每個節點能索引的范圍更大更精確,也意味著 B+樹單次磁盤IO的信息量大于B-樹,I/O效率更高。
Mysql是一種關系型數據庫,區間訪問是常見的一種情況,B+樹葉節點增加的鏈指針,加強了區間訪問性,可使用在范圍區間查詢等,而B-樹每個節點 key 和 data 在一起,則無法區間查找。
2、聚集索引、普通索引的區別、聯系
3、索引建立的原則:
- 列的離散性,離散度越大,建立索引后的訪問效果越好
- 最左匹配原則
- 聯合索引(多列索引、而不是多個索引)
- 覆蓋索引定義
- 一條慢SQL查詢where后面有很多的查詢字段,我們該如何建立聯合索引?遵循的原則:最左匹配原則>離散度高原則>最少空間原則
- explain一條sql語句重點關注的列:type、possible kyes、rows
- 表中有name索引,where name like 'abc%'會用到索引么?為什么?在查詢優化階段會到表中對索引列的數據進行采樣,如果采樣結果判斷出該列的離散性太差,那么也可能導致不會走索引進而進行全表數據的掃描。
- ?
總結
以上是生活随笔為你收集整理的MySQL索引知识复习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Jenkins教程
- 下一篇: 天天生鲜—创建数据库