1. 程式人生 > >大資料量分頁優化--延遲查詢

大資料量分頁優化--延遲查詢

延遲關聯

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查詢行的過程被延後了. --- 這種技巧,稱為”延遲關聯”.