先看個例子
在下面這個表T中,如果我執行 select* from t where k between3and5,需要執行幾次樹的搜索操作,會掃描多少行?
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'),(208,2,'bb'),(300,3,'cc'),(509,5,'ee'),(600,6,'ff'),(788,7,'gg')
表結構如下所示:
現在,我們一起來看看這條SQL查詢語句的執行流程:
- 在k索引樹上找到k=3的記錄,取得ID=300
- 再到ID索引樹查到ID=300對應的R3
- 在k索引樹取下一個值k=5,取得ID=500
- 再回到|D索引樹查到|D=500對應的R4
- 在k索引樹取下一個值k=6,不滿足條件,循環結束
在這個過程中,回到主鍵索引樹搜索的過程,我們稱爲回表。可以看到,這個查詢過程讀了k索引樹的3條記錄(步驟1、3和5),回表了兩次(步驟2和4)。
如何進行索引優化,避免回表?
什麼是覆蓋索引?
如果執行的語句是select ID from T where k between 3 and 5,