mysql 覆蓋索引和聯合索引

2022-03-13 00:13:07 字數 1397 閱讀 1939

我們這裡建立乙個使用者表,表中有字段name,並且在name上有索引

1

create

table

t_user (

2 id bigint(20) not

null

auto_increment ,

3 name varchar(255) not

null,4

primary

key(id),

5index

index_name (name) using btree)

6 engine=

innodb

7default

character

set=utf8 collate=utf8_general_ci

兩棵樹的示例示意圖如下

1.主鍵索引:主鍵索引的葉子節點儲存著主鍵即對應行的全部資料。在innodb裡,主鍵索引也被稱為聚簇索引

2.二級索引(非主鍵索引): 二級索引樹中的葉子結點儲存著索引值和主鍵值,當使用二級索引進行查詢時,需要進行回表操作。在innodb裡,非主鍵索引也被稱為二級索引

如何區分主鍵索引和普通索引的查詢

1

select

*from t_user where id=12

//即主鍵查詢方式,則只需要搜尋id這棵b+樹

1

select

*from t_user where name=

"張三"

2//即普通索引查詢方式,則需要先搜尋name索引樹,得到id的值為3,再到id索引樹搜尋一次。這個過程稱為回表

所以基於二級索引(非主鍵索引)的查詢需要多掃瞄一棵索引樹。因此,我們在應用中應該盡量使用主鍵查詢

3.覆蓋索引

1 a: select id from user_table where name='張三

'2 b: select password from user_table where name='張三

'

語句a: 因為 name索引樹 的葉子結點上儲存有 name和id的值 ,所以通過 name索引樹 查詢到id後,因此可以直接提供查詢結果,不需要回表,也就是說,在這個查詢裡面,索引name 已經 「覆蓋了」 我們的查詢需求,我們稱為 覆蓋索引

語句b: name索引樹 上 找到 name=『張三』 對應的主鍵id, 通過回表在主鍵索引樹上找到滿足條件的資料

因此我們可以得知,當sql語句的所求查詢字段(select列)和查詢條件字段(where子句)全都包含在乙個索引中(聯合索引),可以直接使用索引查詢而不需要回表。這就是覆蓋索引。

MySQL的聯合索引和覆蓋索引

關於mysql的聯合索引,覆蓋索引一直濛濛噠,所以寫點東西來熟悉一下 首先建立乙個表orders,結構如下 create table orders order id int unsigned auto increment,order status int notnull,total price in...

Mysql中的聯合索引 字首索引 覆蓋索引

索引 索引是一種特殊的檔案,它們包含著對資料表裡所有記錄的引用指標。更通俗的說,資料庫索引好比是一本書前面的目錄,能加快資料庫的查詢速度。聯合索引 又名復合索引,由兩個或多個列的索引。它規定了mysql從左到右地使用索引字段,對字段的順序有一定要求。乙個查詢可以只使用索引中的一部分,更準確地說是最左...

MySQL單列索引和聯合索引

所有的mysql列型別能被索引。在相關的列上的使用索引是改進select操作效能的最好方法。乙個表最多可有16個索引。最大索引長度是256個位元組,儘管這可以在編譯mysql時被改變。對於char和varchar列,你可以索引列的字首。這更快並且比索引整個列需要較少的磁碟空間。在create tab...