參考文章:
mysql的分頁查詢十分簡單,但是當資料量大的時候一般的分頁就吃不消了。
傳統分頁查詢:select c1,c2,cn… from table limit n,m
mysql的limit工作原理就是先讀取前面n條記錄,然後拋棄前n條,讀後面m條想要的,所以n越大,偏移量越大,效能就越差。
1、盡量給出查詢的大致範圍
select c1,c2,cn... fromtable
where id>=
20000 limit 10;
2、子查詢法
select c1,c2,cn... fromtable
where id>=
(
select id from
table limit 20000,1
)limit
10;
3、高效能mysql一書中提到的唯讀索引方法
一般表中經常作為條件查詢的列都會建立索引,例如如下查詢
sql** 優化前
select id, content from tb_chat orderby create_time desc limit 24000, 20;
sql** 優化後
select id, content fromtb_chat
inner
join
(
select id from
tb_chat
order
by create_time limit 24000, 20
) as page using(id);
這樣當前查詢頁的內容就只會在索引中進行,當得到當前頁的id再統一通過乙個inner join得到最終要得到的資料詳情,避免了對大量資料詳情進行操作的消耗。當然join操作也可以通過子查詢實現,不過書中介紹5.6之前版本的mysql相比子查詢還是優先使用join。
對上乙個sql繼續優化改進,當有查詢條件分頁時,一定要確保有資料是在limit後面的條件裡,正常有輸入條件檢索查詢應該是limit 0, 10 我寫的是limit 15000,20只是為了測試,因為符合該條件的資料只有1萬5千多個,不然超出這個數就查不到資料了,切記。
select id, content,c.z_type fromtb_chat c
inner
join
(
select id,z_type from tb_chat where z_type='1
'order
by create_time limit 15000, 20
) as page using(id);
等同於:
select c.id, c.content,c.z_type fromtb_chat c
inner
join
(
select id,z_type from tb_chat where z_type='1
'order
by create_time limit 15000, 20
) as p on c.id=p.id;
個人覺得此方法更為通用,而且經過我的測試,發現表中總資料只有3萬條資料時兩個sql語句的執行時間竟然相差4倍,優化前的sql執行需要120ms,而優化後的sql需要30ms。
4、第一步用用程式讀取出id,然後再用in方法讀取所需記錄
程式讀id:
select id fromtable limit 20000, 10
;select c1, c2, cn .. . from
table
where id in (id1, id2, idn.. .)
mysql大資料量分頁查詢優化
參考文章 mysql的分頁查詢十分簡單,但是當資料量大的時候一般的分頁就吃不消了。傳統分頁查詢 select c1,c2,cn from table limit n,m mysql的limit工作原理就是先讀取前面n條記錄,然後拋棄前n條,讀後面m條想要的,所以n越大,偏移量越大,效能就越差。1 盡...
mysql大資料量分頁查詢優化總結
mysql的分頁查詢十分簡單,但是當資料量大的時候一般的分頁就吃不消了。傳統分頁查詢 select c1,c2,cn from table limit n,m mysql的limit工作原理就是先讀取前面n條記錄,然後拋棄前n條,讀後面m條想要的,所以n越大,偏移量越大,效能就越差。1 limit語...
Mysql大資料量分頁優化
假設有乙個千萬量級的表,取1到10條資料 select from table limit 0,10 select from table limit 1000,10 這兩條語句查詢時間應該在毫秒級完成 select from table limit 3000000,10 你可能沒想到,這條語句執行之間...