MySQL中的回表和索引覆蓋示例詳解

2022-09-21 15:57:10 字數 1205 閱讀 7075

目錄

聚簇索引: 葉子節點儲存的是行記錄,每個表必須要有至少乙個聚簇索引。使用聚簇索引查詢會很快,因為可以直接定位到行記錄

普通索引:二級索引,除聚簇索引外的索引,即非聚簇索引。普通索引葉子節點儲存的是主鍵www.cppcns.com(聚簇索引)的值。

聚簇索引遞推規則:

id 是主鍵,所以是聚簇索引,其葉子節點儲存的是對應行記錄的資料

非聚簇索引(non-clusteredindex)

聚簇索引查詢

如果查詢條件為主鍵(聚簇索引),則只需掃瞄一次b+樹即可通過聚簇索引定位到要查詢的行記錄資料。

程式設計客棧如:select * from user where id = 1;

如果查詢條件為普通索引(非聚簇索引),需要掃瞄兩次b+樹,第一次掃瞄通過普通索引定位到聚簇索引的值,然後第二次掃瞄通過聚簇索引的值定位到要查詢的行記錄資料。

如:select * from user where age = 30;

1. 先通過普通索引 age=30 定位到主鍵值 id=1

2. 再通過聚集索引 id=1 定位到行記錄資料

先通過普通索引的值定位聚簇索引值,再通過聚簇索引的值定位行記錄資料,需要掃瞄兩次索引b+樹,它的效能較掃一程式設計客棧遍索引樹更低。

只需要在一棵索引樹上就能獲取sql所需的所有列資料,無需回表,速度更快。

例如:select id,age from user where age = 10;

使用id,age,name查詢:

select id,age,name, salary from user where age = 10;

explain分析:age是普通索引,但name列不在索引樹上,所以通過age索引在查詢到id和age的值後,需要進行回表再查詢name的值。此時的extra列的using where表示進行了回表查詢

type: all, 表示全表掃瞄

增加表的聯合索引:create index idx_user_name_age_salary on mydb.user (name, age, salary);

explain分析:此時欄位age和name是組合索引idx_age_name,查詢的字段id、age、name的值剛剛都在索引樹上,只需掃瞄一次組合索引b+樹即可,這就是實現了索引覆蓋,此時的extra欄位為using index表示使用了索引覆蓋。

分頁查詢(非利用索引):

新增索引之後,即可實現利用索引快速查詢。

Mysql索引 回表 索引覆蓋

1.先說什麼是索引?索引是一種資料結構 不同引擎對索引的實現方式不同,innodb採用b 樹作為索引結構。2.聚簇索引 非聚簇索引索引可分為聚簇索引和非聚簇索引兩種。聚簇索引 clustered index 聚簇索引的資料的物理存放順序與索引順序是一致的。非聚簇索引 二級索引 secondary i...

MySQL索引,回表,索引覆蓋

多讀多寫多記錄,多學多練多思考。banana.banuit gang 香柚幫 mysql innodb的主鍵索引是簇集索引,也就是索引的葉子節點存的是整個單條記錄的所有字段值,不是主鍵索引的就是非簇集索引,非簇集索引的葉子節點存的是主鍵欄位的值。回表是什麼意思?就是你執行一條sql語句,需要從兩個b...

mysql覆蓋索引與回表

要說回表查詢,先要從innodb的索引實現說起。innodb有兩大類索引,一類是聚集索引 clustered index 一類是普通索引 secondary index innodb的聚集索引 innodb聚集索引的葉子節點儲存行記錄,因此innodb必須要有且只有乙個聚集索引。1.如果表定義了pk...