多讀多寫多記錄,多學多練多思考。---------- banana.banuit gang(香柚幫)
mysql innodb的主鍵索引是簇集索引,也就是索引的葉子節點存的是整個單條記錄的所有字段值,不是主鍵索引的就是非簇集索引,非簇集索引的葉子節點存的是主鍵欄位的值。
回表是什麼意思?
就是你執行一條sql語句,需要從兩個b+索引中去取資料。
舉個例子:表tbl有a,b,c三個字段,其中a是主鍵,b上建了索引,然後編寫sql語句select * from tbl where a=1,這樣不會產生回表,因為所有的資料在a的索引樹中均能找到。而select * from tbl where b=1,這樣就會產生回表,因為where條件是b欄位,那麼會去b的索引樹里查詢資料,但b的索引裡面只有a,b兩個欄位的值,沒有c,那麼這個查詢為了取到c欄位,就要取出主鍵a的值,然後去a的索引樹去找c欄位的資料。查了兩個索引樹,這就叫回表。
索引覆蓋
索引覆蓋就是查這個索引能查到你所需要的所有資料,不需要去另外的資料結構去查。其實就是不用回表。
怎麼避免?
不是必須的字段就不要出現在select裡面。或者b,c建聯合索引。但具體情況要具體分析,索引欄位多了,儲存和插入資料時的消耗會更大。這是個平衡問題。
Mysql索引 回表 索引覆蓋
1.先說什麼是索引?索引是一種資料結構 不同引擎對索引的實現方式不同,innodb採用b 樹作為索引結構。2.聚簇索引 非聚簇索引索引可分為聚簇索引和非聚簇索引兩種。聚簇索引 clustered index 聚簇索引的資料的物理存放順序與索引順序是一致的。非聚簇索引 二級索引 secondary i...
mysql覆蓋索引與回表
要說回表查詢,先要從innodb的索引實現說起。innodb有兩大類索引,一類是聚集索引 clustered index 一類是普通索引 secondary index innodb的聚集索引 innodb聚集索引的葉子節點儲存行記錄,因此innodb必須要有且只有乙個聚集索引。1.如果表定義了pk...
MySQL 的覆蓋索引與回表
如果表設定了主鍵,則主鍵就是聚簇索引 如果表沒有主鍵,則會預設第乙個not null,且唯一 unique 的列作為聚簇索引 以上都沒有,則會預設建立乙個隱藏的row id作為聚簇索引 innodb的聚簇索引的葉子節點儲存的是行記錄 其實是頁結構,乙個頁包含多行資料 innodb必須要有至少乙個聚簇...