這邊舉一個PK查詢,一個全表掃描為例
select * from product where id = 1;
select * from product where name = 'iphone';
以下就相對不一定這麼重要,算是MySQL本身的優化,可以有興趣再閱讀
| Name | Age | Reward |
|-------|-----|-----------|
| 路飛 | 20 | 100000 |
| 索隆 | 22 | 900000 |
| 香吉士 | 24 | 800000 |
| 凱多 | 49 | 19999999 |
| 娜美 | 18 | 50000 |
如果我有一個表如下,做了聯合索引 index(Age, Reward)
select * from t_user where age > 20 and reward = 100000;
因為是範圍查詢(age>20),只有 age 可以利用到聯合索引, reward 無法利用(詳細參考索引常見面試題)。
沒有索引下推的版本,每查到一次二級索引,都會回表
結論:有了索引下推,雖然reward欄位沒法使用到聯合索引,但直接在儲存引擎中filter出 reward=10000才執行回表,節省了回表操作,理論上效能更好。
有使用索引下推 在 explain sql 的資訊裡面 Extra欄位 會顯示 Using index condition
明天分享為什麼 MySQL innodb 使用 B+Tree