在下列表T中,執行 ,需要執行幾次樹的搜索操作? 語句執行流程: 1. 在k索引樹上找到k值為3的記錄,取得ID為300 2. 再到ID索引樹上找到ID為300對應的R3記錄 3. 在k索引樹上找到k值為5的記錄,取得ID為500 4. 再回到ID索引樹上找到ID為500對應的R4記錄 5. 在k索 ...
在下列表T中,執行select * from T where k betwee 3 and 5;
,需要執行幾次樹的搜索操作?
mysql> create table T (
ID int primary key,
k int NOT NULL DEFAULT 0,
s varchar(16) NOT NULL DEFAULT '',
index k(k))
engine=InnoDB;
insert into T values(100,1, 'aa'),(200,2,'bb'),(300,3,'cc'),(500,5,'ee'),(600,6,'ff'),(700,7,'gg');
SQL
語句執行流程:
- 在k索引樹上找到k值為3的記錄,取得ID為300
- 再到ID索引樹上找到ID為300對應的R3記錄
- 在k索引樹上找到k值為5的記錄,取得ID為500
- 再回到ID索引樹上找到ID為500對應的R4記錄
- 在k索引樹上找到k值為6的記錄,不符合條件,結束迴圈
在這個過程中,回到主鍵索引搜索樹的過程,成為回表。
在這個例子中,由於查詢結果所需要的數據只有主鍵索引上有,所以不得不回表。如果執行的語句是select ID from T where k between 3 and 5;
,只需要查詢ID的值,而k索引樹上有這個值,不需要回表,索引k已經覆蓋了查詢所需要的值,成為覆蓋索引。
覆蓋索引可以減少樹的搜索次數,顯著提升查詢性能,所以使用覆蓋索引是一個常用的性能優化手段。
聯合索引:將多個欄位設置為索引,在B+樹上符合最左首碼原則。