我們這裡建立乙個使用者表,表中有字段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裡,非主鍵索引也被稱為二級索引
如何區分主鍵索引和普通索引的查詢
1select
*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='張三語句a: 因為 name索引樹 的葉子結點上儲存有 name和id的值 ,所以通過 name索引樹 查詢到id後,因此可以直接提供查詢結果,不需要回表,也就是說,在這個查詢裡面,索引name 已經 「覆蓋了」 我們的查詢需求,我們稱為 覆蓋索引'2 b: select password from user_table where 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...