MySQL百萬資料,你如何用分頁來查詢資料

2022-06-10 14:45:15 字數 2491 閱讀 3416

在開發過程中我們經常會使用分頁,核心技術是使用limit進行資料的讀取,在使用limit進行分頁的測試過程中,得到以下資料:

select

*from news order

by id desc limit 0,10

耗時0.003秒

select

*from news order

by id desc limit 10000,10

耗時0.058秒

select

*from news order

by id desc limit 100000,10

耗時0.575秒

select

*from news order

by id desc limit 1000000,10

耗時7.28秒

我們驚訝的發現mysql在資料量大的情況下分頁起點越大查詢速度越慢,100萬條起的查詢速度已經需要7秒鐘。這是乙個我們無法接受的數值!

改進方案 1

select

*from

news

where id > (select id from news order

by id desc limit 1000000, 1

)order

by id desc

limit

0,10

查詢時間 0.365秒,提公升效率是非常明顯的!!原理是什麼呢???

我們使用條件對id進行了篩選,在子查詢 (select id from news order by id desc limit 1000000, 1) 中我們只查詢了id這乙個字段比起select * 或 select 多個字段 節省了大量的查詢開銷!

改進方案2

select

*from

news

where id between

1000000

and1000010

order

by id desc

不適合帶有條件的、id不連續的查詢。速度非常快!

百萬資料分頁的注意事項

select id from

news

where cate =

1order

by id desc

limit

500000 ,10

查詢時間 20 秒

好恐怖的速度!!利用上面方案進行優化:

select

*from

news

where cate =

1and id > (select id from news where cate =

1order

by id desc limit 500000,1

) order

by id desc

limit

0,10

查詢時間 15 秒

優化效果不明顯,條件帶來的影響還是很大!在這樣的情況下無論我們怎麼去優化sql語句就無法解決執行效率問題。

表 news2 [ 文章表 引擎 myisam 字符集 utf-8 ]

id int 11 主鍵自動增加

cate int 11 索引

在寫入資料時將2張表同步,查詢是則可以使用news2 來進行條件查詢:

select

*from

news

where cate =

1and id > (select id from news2 where cate =

1order

by id desc limit 500000,1

) order

by id desc

limit

0,10

注意條件 id > 後面使用了news2 這張表!

執行時間 1.23秒,我們可以看到執行時間縮減了近20倍!!資料在10萬左右是查詢時間可以保持在0.5秒左右,是乙個逐步接近我們能夠容忍的值!

但是1秒對於伺服器來說依然是乙個不能接受的值!!還有什麼可以優化的辦法嗎??

我們嘗試了乙個偉大的變化:

將 news2 的儲存引擎改變為innodb,執行結果是驚人的!

select

*from

news

where cate =

1and id > (select id from news2 where cate =

1order

by id desc limit 500000,1

) order

by id desc

limit

0,10

只需要 0.2秒,非常棒的速度。

到了這一步,我們的分頁優化完畢,顯然是有很大的效果的。你自己可以測試一下!

MySQL百萬級資料分頁查詢優化方案

當需要從資料庫查詢的表有上萬條記錄的時候,一次性查詢所有結果會變得很慢,特別是隨著資料量的增加特別明顯,這時需要使用分頁查詢。對於資料庫分頁查詢,也有很多種方法和優化的點。下面簡單說一下我知道的一些方法。準備工作 為了對下面列舉的一些優化進行測試,下面針對已有的一張表進行說明。表名 order hi...

百萬條資料分頁

寫出 之前,先說明一下原理,比較簡單。有一張表 test 如下 結構是 id 自動編號 txt 假設40條記錄 現在要每頁顯示10條記錄,則每頁要顯示的資料應該是 第一頁 10 第二頁 11 20 第三頁 21 30 第四頁 31 40 如要顯示第一頁,最簡單的方法就是 select top 10 ...

MySQL 百萬級以上分頁優化

正常我們碼農資料庫的時候一般都是以下這種查詢方式 select from table order by id limit 100000,10 但是以上這種查詢會導致我們資料慢死,一般我們採用以下方式 select from table order by id limit 1000000,10 以上這...