1. 大量數(shù)據(jù)的分頁查詢
有一張財務(wù)流水表馍惹,未分庫分表躺率,目前的數(shù)據(jù)量為9555695玛界,分頁查詢使用到了limit,優(yōu)化之前的查詢耗時16 s 938 ms (execution: 16 s 831 ms, fetching: 107 ms)悼吱,按照下文的方式調(diào)整SQL后慎框,耗時347 ms (execution: 163 ms, fetching: 184 ms);
操作:查詢條件放到子查詢中后添,子查詢只查主鍵ID笨枯,然后使用子查詢中確定的主鍵關(guān)聯(lián)查詢其他的屬性字段;原理:
1遇西、減少回表操作馅精;
2、可參考《阿里巴巴Java開發(fā)手冊(泰山版)》第五章-MySQL數(shù)據(jù)庫粱檀、(二)索引規(guī)約洲敢、第7條:
【推薦】利用延遲關(guān)聯(lián)或者子查詢優(yōu)化超多分頁場景。
說明: MySQL并不是挑過offeset行梧税,而是取offset+N行沦疾,然后返回放棄前offset行,返回N行第队,那當(dāng)offset特別大的時候哮塞,效率就非常的底下,要么控制返回的總頁數(shù)凳谦,要么對超過特定閾值的頁數(shù)進(jìn)行SQL改寫忆畅。
正例: 先快速定位需要獲取的id段,然后再關(guān)聯(lián):SELECT a.* FROM 表1 a,(select id from 表1 where 條件 LIMIT 100000,20) b where a.id = b.id;
-- 優(yōu)化前SQL
SELECT 各種字段
FROM `table_name`
WHERE 各種條件
LIMIT 0,10;
-- 優(yōu)化后SQL
SELECT 各種字段
FROM `table_name` main_tale
RIGHT JOIN
(
SELECT 子查詢只查主鍵
FROM `table_name`
WHERE 各種條件
LIMIT 0,10;
) temp_table ON temp_table.主鍵 = main_table.主鍵