mysql大資料量分頁查詢優化

2021-09-07 08:49:37 字數 1985 閱讀 6673

參考文章:

mysql的分頁查詢十分簡單,但是當資料量大的時候一般的分頁就吃不消了。

傳統分頁查詢:select c1,c2,cn… from table limit n,m

mysql的limit工作原理就是先讀取前面n條記錄,然後拋棄前n條,讀後面m條想要的,所以n越大,偏移量越大,效能就越差。

1、盡量給出查詢的大致範圍

select c1,c2,cn... from

table

where id>=

20000 limit 10;

2、子查詢法

select c1,c2,cn... from

table

where id>=

(

select id from

table limit 20000,1

)limit

10;

3、高效能mysql一書中提到的唯讀索引方法

一般表中經常作為條件查詢的列都會建立索引,例如如下查詢

sql**  優化前

select id, content  from tb_chat order

by create_time desc limit 24000, 20;

sql**   優化後

select id, content from

tb_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 from

tb_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 from

tb_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 from

table 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 你可能沒想到,這條語句執行之間...