mysql高級知識總結

這篇文章的知識點來自於極客時間專欄<<MySQL實戰45講>>,本文持續更新。算法

索引

索引的目的:提升查詢效率。數據庫

常見索引模型:哈希表、有序數組、搜索樹

哈希表:鍵 - 值(key - value)對。
哈希思路:把值放在數組裏,用一個哈希函數把key換算成一個肯定的位置,而後把value放在數組的這個位置
哈希衝突(多個 key 值通過哈希函數的換算,會出現同一個值的狀況)的處理辦法:鏈表
哈希表適用場景:只有等值查詢的場景,好比 Memcached 及其餘一些 NoSQL 引擎。數組

有序數組:按順序存儲。查詢用二分法就能夠快速查詢,時間複雜度是:O(log(N))
有序數組查詢效率高,更新效率低,往中間插入一個記錄就必須得挪動後面全部的記錄,成本過高。
有序數組的適用場景:靜態存儲引擎。函數

二叉搜索樹:每一個節點的左兒子小於父節點,父節點又小於右兒子
二叉搜索樹:查詢時間複雜度O(log(N)),更新時間複雜度O(log(N))
數據庫存儲大多不適用二叉樹,由於樹高太高,會適用N叉樹性能

MySQL表引擎InnoDB中的索引模型:B+Tree

索引類型:主鍵索引、非主鍵索引
主鍵索引的葉子節點存的是整行的數據(聚簇索引),非主鍵索引的葉子節點內容是主鍵的值(二級索引)code

主鍵索引和普通索引的區別:主鍵索引只要搜索ID這個B+Tree便可拿到數據。普通索引先搜索索引拿到主鍵值,再到主鍵索引樹搜索一次(回表),因此在應用中儘可能使用主鍵查詢。索引

一個數據頁滿了,按照B+Tree算法,新增長一個數據頁,叫作頁分裂,會致使性能降低。空間利用率下降大概50%。當相鄰的兩個數據頁利用率很低的時候會作數據頁合併,合併的過程是分裂過程的逆過程。字符串

自增主鍵

使用自增主鍵的好處:get

  1. 自增主鍵通常用整型作主鍵,則二級索引葉子節點只要 4 個字節;而若是使用業務字段作主鍵,好比字符串類型的身份證號,每一個二級索引的葉子節點得佔用約 20 個字節。
  2. 插入數據時,自增主鍵能保證有序插入,避免了頁分裂。

從性能和存儲空間方面考量,自增主鍵每每是更合理的選擇。table

使用業務字段作主鍵的使用場景:

  1. 只有一個索引
  2. 該索引必須是惟一索引

這就是典型的 KV 場景。因爲沒有其餘索引,因此不用考慮其餘索引的葉子節點大小的問題.

重建索引

重建索引的目的:節省空間
重建索引的辦法:alter table T engine=InnoDB

聯合索引

覆蓋索引:若是查詢條件使用的是普通索引(或是聯合索引的最左原則字段),查詢結果是聯合索引的字段或是主鍵,不用回表操做,直接返回結果,減小IO磁盤讀寫讀取正行數據
最左前綴:聯合索引的最左 N 個字段,也能夠是字符串索引的最左 M 個字符
聯合索引:根據建立聯合索引的順序,以最左原則進行where檢索,好比(age,name)以age=1 或 age= 1 and name=‘張三’可使用索引,單以name=‘張三’ 不會使用索引,考慮到存儲空間的問題,還請根據業務需求,將查找頻繁的數據進行靠左建立索引。
索引下推:like 'hello%’and age >10 檢索,MySQL5.6版本以前,會對匹配的數據進行回表查詢。5.6版本後,會先過濾掉age<10的數據,再進行回表查詢,減小回表率,提高檢索速度。

參考資料

極客時間MySQL實戰45講

相關文章
相關標籤/搜索