mysql索引(極客時間)

2021-10-06 22:50:56 字數 2728 閱讀 2406

innodb中使用了b+樹資料結構,每乙個索引在innodb都對應一顆b+樹。

b+樹的特點是能夠保持資料穩定有序,其插入與修改擁有較穩定的對數時間複雜度。b+樹元素自底向上插入,這與二叉樹恰好相反。具體的定以與性質可以在其他文章檢視到。

現在有一張表

mysql>

create

table t(

id int

primary

key,

k int

notnull

, name varchar(16

),index

(k))

engine

=innodb

;

表中 r1~r5 的 (id,k) 值分別為 (100,1)、(200,2)、(300,3)、(500,5) 和 (600,6),兩棵樹的示例示意圖如下。

主鍵索引的葉子節點存的是整行資料。在 innodb 裡,主鍵索引也被稱為聚簇索引(clustered index)。

非主鍵索引的葉子節點內容是主鍵的值。在 innodb 裡,非主鍵索引也被稱為二級索引(secondary index)。

在執行一條語句 select * from t where id=500,即主鍵查詢方式,則只需要搜尋 id 這棵 b+ 樹;

在執行 select * from t where k=5,則需要先搜尋 k 索引樹,得到 id 的值為 500,再到 id 索引樹搜尋一次。這個過程稱為回表

而頻繁的回表常常會對效能有所影響。那麼如何減少?

如果執行的語句是select id from t where k between 3 and 5,這時只需要查 id 的值,而 id 的值已經在 k 索引樹上了,因此可以直接提供查詢結果,不需要回表。也就是說,在這個查詢裡面,索引 k 已經「覆蓋了」我們的查詢需求,我們稱為覆蓋索引。

由於覆蓋索引可以減少樹的搜尋次數,顯著提公升查詢效能,所以使用覆蓋索引是乙個常用的效能優化手段。

聯合索引又叫復合索引。對於復合索引:mysql從左到右的使用索引中的字段,乙個查詢可以只使用索引中的一部份,但只能是最左側部分。例如索引是key index (a,b,c). 可以支援a | a,b| a,b,c 3種組合進行查詢,但不支援 b,c進行查詢 .當最左側欄位是常量引用時,索引就十分有效。

我們用(name,age)這個聯合索引來分析

可以看到,索引項是按照索引定義裡面出現的字段順序排序的。

當你的邏輯需求是查到所有名字是「張三」的人時,可以快速定位到 id4,然後向後遍歷得到所有需要的結果。

如果你要查的是所有名字第乙個字是「張」的人,你的 sql 語句的條件是"where name like 『張 %』"。這時,你也能夠用上這個索引,查詢到第乙個符合條件的記錄是 id3,然後向後遍歷,直到不滿足條件為止。

上一段我們說到滿足最左字首原則的時候,最左字首可以用於在索引中定位記錄。這時,你可能要問,那些不符合最左字首的部分,會怎麼樣呢?我們還是以市民表的聯合索引(name, age)為例。如果現在有乙個需求:檢索出表中「名字第乙個字是張,而且年齡是 10 歲的所有男孩」。那麼,sql 語句是這麼寫的:

mysql>

select

*from tuser where name like

'張%'

and age=

10and ismale=

1;

你已經知道了字首索引規則,所以這個語句在搜尋索引樹的時候,只能用 「張」,找到第乙個滿足條件的記錄 id3。當然,這還不錯,總比全表掃瞄要好。

在 mysql 5.6 之前,只能從 id3 開始乙個個回表。到主鍵索引上找出資料行,再對比字段值。

而 mysql 5.6 引入的索引下推優化(index condition pushdown), 可以在索引遍歷過程中,對索引中包含的字段先做判斷,直接過濾掉不滿足條件的記錄,減少回表次數。

覆蓋索引:如果查詢條件使用的是普通索引(或是聯合索引的最左原則字段),查詢結果是聯合索引的字段或是主鍵,不用回表操作,直接返回結果,減少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 學習記錄

rollback 回滾 s epoint identifier s epoint允許你在事務中建立乙個儲存點,乙個事務中可以有多個s epoint release s epoint identifier 刪除乙個事務的儲存點 rollback to s epoint identifier 將事務回滾...

極客時間 演算法

1.合格程式設計師的第一步 演算法和資料結構 2.如何事半功倍的學習演算法和資料結構 1 怎樣去學習精通乙個領域?a.chunk it up 切碎知識點 同事注意各個知識點的聯絡,輔助記憶 b.deliberate practicing 刻意練習 c.feedback 和別人的做飯比較,高手指點 2...

極客時間的專欄

丁奇老師帶我們去學習mysql的45講,有mysql的完整學習路徑,資料庫是程式設計界必備基礎,還是比較推薦的。這是我買的第一篇專欄,老師帶我們去深入剖析tomcat和jetty,雖然不是特別新的技術,但是市場很成熟了,tomcat內部的 還是很值的我們去學習的。這是極客時間上訂閱最多的一篇專欄,已...