最近咱們的一個項目,因爲一次請求知足條件數據庫的數據量過於大,因此頁面的訪問非常緩慢,如今在作優化就是一次只請求一頁數據過來,當用戶點擊下一頁或者上一頁或者進入指定的頁就會當即去請求這樣會很快,能夠極大的提升速度。mysql
因爲咱們的數據庫用的是mysql,故而通常使用的limit start,count來進行分頁請求,這樣的請求看似是極好的,可是當咱們的數據量很大的時候,到達幾百萬的狀況下,找最後一頁的數據的的速率會降低,就是start 數值越大,咱們的效率就月底。sql
1統計全部的條數 . 數據庫
被咱們的cpu_statistic表有3百多萬條數據,dom
終端在線統計表裏面沒有數據優化
能夠看到數據量越大,統計的時間就越長(統計所得,三百多萬條,耗時0.7秒,五百多萬條,耗時就達到了10秒多)。spa
2. limit分頁優化code
1). 查詢前三條數據,速度極快:排序
這個是根據id降序排列索引
這個是沒有排序,默認是升序的terminal
能夠看獲得查詢的數據仍是極快的,
2).查詢倒數兩條數據,就能夠看獲得最起碼要花掉1秒的時間
首先咱們能夠看獲得,上圖有兩種方法,
第一種方法,最原始的limit start,count 花了1.78秒,能夠看到隨着start的增大時間變長了,緣由是mysql要掃描前3407870條數據及之後的三天,而後把前3407870條記錄給拋棄了。
第二種方法,直接查找從哪兒開始開始的3條記錄,id直接判斷,調過了所有掃描的過程,因此更快,且隨着數據增加速度會更快
下面還有第三種方法,內鏈接,運行效果以下:
能夠看得出效果也是比最原始的limit start,count變快了,可是效果比第二種方法慢一點,但也差不了多少,因此我推薦使用第二種方法。
總結下來就是優化limit有兩種方法:
子查詢
內鏈接
3.分頁的limit以前若是不加上order by語句,查詢時間就會縮短。
能夠看獲得每條語句比不加order by要快上400多毫秒。
4.詳細的解釋分頁優化子查詢的語句的意思(新手能夠不太懂,能夠看看,有經驗的能夠略去)
不少新手可能不理解這個句子,下面咱們就一步一步的解釋這個句子
查詢知足條件的全部的數據安裝id逆序排列
select * from terminal_online_statistic WHERE domain_moid = 'dcb80871-372b-4617-b329-9aafe6f78acb' && statistic_time BETWEEN '2015-08-04 10:57:48' AND '2015-08-04 14:57:49' order by id desc;
運行結果爲:
而後咱們去前幾條的l原始imit語句
select * from terminal_online_statistic WHERE domain_moid = 'dcb80871-372b-4617-b329-9aafe6f78acb' && statistic_time BETWEEN '2015-08-04 10:57:48' AND '2015-08-04 14:57:49' order by id desc limit 0,3
效果以下:
優化的limit語句不少人可能剛開始寫的以下.
select * from terminal_online_statistic where id<=(select id from terminal_online_statistic WHERE domain_moid = 'dcb80871-372b-4617-b329-9aafe6f78acb' && statistic_time BETWEEN '2015-08-04 10:57:48' AND '2015-08-04 14:57:49' order by id desc limit 0,1) order by id desc limit 3.
運行結果以下:
能夠看到不知足條件的也運行出來了。
緣由以下:咱們子查詢的語句作了篩選,知足其第一條的id爲49,可是咱們外面的查詢沒有作篩選,致使外面是查詢全部的id<49的數據,而後逆序排列,而後之顯示3條。
外層的也要作篩選,正確的語句以下:
select * from terminal_online_statistic where domain_moid = 'dcb80871-372b-4617-b329-9aafe6f78acb' && statistic_time BETWEEN '2015-08-04 10:57:48' AND '2015-08-04 14:57:49' && id<=(select id from terminal_online_statistic WHERE domain_moid = 'dcb80871-372b-4617-b329-9aafe6f78acb' && statistic_time BETWEEN '2015-08-04 10:57:48' AND '2015-08-04 14:57:49' order by id desc limit 0,1) order by id desc limit 3
正確的結果與原始的limit分頁語句如出一轍。
------------------後面更新----------------
以前雖然總結了這篇文章,可是其實一直沒有理解,爲何子查詢和內連接會比較快了,緣由在於,第一種查詢。回表的次數比較多,須要根據ID查詢出基本信息,會回表3407870+3次,可是換成子查詢和內鏈接以後,第一次查詢的時候,直接返回索引的ID,而後查詢出知足條件的出來後,只回表3次。因此效率高