程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> MSSQL >> SQL Server誤區30日談 第22天 資本調控器可以調控IO

SQL Server誤區30日談 第22天 資本調控器可以調控IO

編輯:MSSQL

SQL Server誤區30日談 第22天 資本調控器可以調控IO。本站提示廣大學習愛好者:(SQL Server誤區30日談 第22天 資本調控器可以調控IO)文章只能為提供參考,不一定能成為您想要的結果。以下是SQL Server誤區30日談 第22天 資本調控器可以調控IO正文


之前我在mysql平分頁都是用的 limit 100000,20如許的方法,我信任你也是吧,然則要進步效力,讓分頁的代碼效力更高一些,更快一些,那我們又該怎樣做呢?

第一部門:看一下分頁的根本道理:


mysql explain SELECT * FROM message ORDER BY id DESC LIMIT 10000, 20
***************** 1. row **************
id: 1
select_type: SIMPLE
table: message
type: index
possible_keys: NULL
key: PRIMARY
key_len: 4
ref: NULL
rows: 10020
Extra:
1 row in set (0.00 sec)

對下面的mysql語句解釋:limit 10000,20的意思掃描知足前提的10020行,扔失落後面的10000行,前往最初的20行,成績就在這裡,假如是limit 100000,100,須要掃描100100行,在一個高並發的運用裡,每次查詢須要掃描跨越10W行,機能確定年夜打扣頭。文中還提到limit n機能是沒成績的,由於只掃描n行。

第二部門:依據雅虎的幾位工程師帶來了一篇Efficient Pagination Using MySQL的申報內容擴大:在文中提到一種clue的做法,給翻頁供給一些線索,好比照樣SELECT * FROM message ORDER BY id DESC,按id降序分頁,每頁20條,以後是第10頁,以後頁條目id最年夜的是1020,最小的是1000,假如我們只供給上一頁、下一頁如許的跳轉(不供給到第N頁的跳轉),那末在處置上一頁的時刻SQL語句可所以:

SELECT * FROM message WHERE id>1020 ORDER BY id ASC LIMIT 20;//下一頁

處置下一頁的時刻SQL語句可所以:

SELECT * FROM message WHERE id<1000 ORDER BY id DESC LIMIT 20;//上一頁

不論翻若干頁,每次查詢只掃描20行。

缺陷是只能供給上一頁、下一頁的鏈接情勢,然則我們的產物司理異常愛好“上一頁 1 2 3 4 5 6 7 8 9 下一頁”如許的鏈接方法,怎樣辦呢?

假如LIMIT m,n弗成防止的話,要優化效力,只要盡量的讓m小一下,我們擴大後面的clue做法,照樣SELECT * FROM message ORDER BY id DESC,按id降序分頁,每頁20條,以後是第10頁,以後頁條目id最年夜的是2519,最小的是2500;

當是第10頁的SQL以下:

SELECT * FROM tb_goods_info WHERE auto_id >=2500 ORDER BY auto_id ASC LIMIT 0,20

好比要跳到第9頁,SQL語句可以如許寫:

SELECT * FROM tb_goods_info WHERE auto_id <2500 ORDER BY auto_id desc LIMIT 0,20

好比要跳到第8頁,SQL語句可以如許寫:

SELECT * FROM tb_goods_info WHERE auto_id <2500 ORDER BY auto_id desc LIMIT 20,20

好比要跳到第7頁,SQL語句可以如許寫:

SELECT * FROM tb_goods_info WHERE auto_id <2500 ORDER BY auto_id desc LIMIT 40,20

跳轉到第11頁:

SELECT * FROM tb_goods_info WHERE auto_id >2519 ORDER BY auto_id asc LIMIT 0,20

跳轉到第12頁:

SELECT * FROM tb_goods_info WHERE auto_id >2519 ORDER BY auto_id asc LIMIT 20,20

跳轉到第13頁:

SELECT * FROM tb_goods_info WHERE auto_id >2519 ORDER BY auto_id asc LIMIT 40,20

道理照樣一樣,記載住以後頁id的最年夜值和最小值,盤算跳轉頁面和以後頁絕對偏移,因為頁面鄰近,這個偏移量不會很年夜,如許的話m值絕對較小,年夜年夜削減掃描的行數。其實傳統的limit m,n,絕對的偏移一向是第一頁,如許的話越翻到前面,效力越差,而下面給出的辦法就沒有如許的成績。

留意SQL語句外面的ASC和DESC,假如是ASC掏出來的成果,顯示的時刻記得顛倒一下。

已在60W數據總量的表中測試,後果異常顯著

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved