大資料量分頁優化--延遲查詢
阿新 • • 發佈:2019-02-10
延遲關聯
select * from it_area where name like '%東山%';
+------+-----------+------+| id | name | pid |
+------+-----------+------+
| 757 | 東山區 | 751 |
| 1322 | 東山縣 | 1314 |
| 2118 | 東山區 | 2116 |
| 3358 | 東山區 | 3350 |
+------+-----------+------+
4 rows in set (0.00 sec)
分析: 這句話用到了索引覆蓋沒有?
答: 沒有,1 查詢了所有列, 沒有哪個索引,覆蓋了所有列.
2 like %xx%”,左右都是模糊查詢, name本身,都沒用上索引
第2種做法:
select a.* from it_area as a inner join (select id from it_area where name like '%東山%') as t on a.id=t.id;
Show profiles; 檢視效率:
| 18 | 0.00183800 | select * from it_area where name like '%東山%'
| 20 | 0.00169300 | select a.* from it_area as a inner join (select id from it_area where name like '%東山%') as t on a.id=t.id |
發現 第2種做法,雖然語句複雜,但速度卻稍佔優勢.
第2種做法中, 內層查詢,只沿著name索引層順序走, name索引層包含了id值的.
所以,走完索引層之後,找到所有合適的id,
再通過join, 用id一次性查出所有列. 走完name列再取.
第1種做法: 沿著name的索引檔案走, 走到滿足的條件的索引,就取出其id,
並通過id去取資料, 邊走邊取.
通過id查詢行的過程被延後了. --- 這種技巧,稱為”延遲關聯”.