程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MySQL單表百萬數據記載分頁機能優化技能

MySQL單表百萬數據記載分頁機能優化技能

編輯:MySQL綜合教程

MySQL單表百萬數據記載分頁機能優化技能。本站提示廣大學習愛好者:(MySQL單表百萬數據記載分頁機能優化技能)文章只能為提供參考,不一定能成為您想要的結果。以下是MySQL單表百萬數據記載分頁機能優化技能正文


測試情況:

先讓我們熟習下根本的sql語句,來檢查下我們將要測試表的根本信息

use infomation_schema
SELECT * FROM TABLES WHERE TABLE_SCHEMA = ‘dbname' AND TABLE_NAME = ‘product'

查詢成果:

從上圖中我們可以看到表的根本信息:

表行數:866633
均勻每行的數據長度:5133字節
單表年夜小:4448700632字節

關於行和表年夜小的單元都是字節,我們經由盤算可以曉得
均勻行長度:年夜約5k
單表總年夜小:4.1g
表中字段各類類型都有varchar、datetime、text等,id字段為主鍵

測試試驗

1. 直接用limit start, count分頁語句, 也是我法式頂用的辦法:

select * from product limit start, count
當肇端頁較小時,查詢沒有機能成績,我們分離看下從10, 100, 1000, 10000開端分頁的履行時光(每頁取20條), 以下:

select * from product limit 10, 20  0.016秒
select * from product limit 100, 20  0.016秒
select * from product limit 1000, 20  0.047秒
select * from product limit 10000, 20  0.094秒

我們曾經看出跟著肇端記載的增長,時光也跟著增年夜, 這解釋分頁語句limit跟肇端頁碼是有很年夜關系的,那末我們把肇端記載改成40w看下(也就是記載的普通閣下) select * from product limit 400000, 20 3.229秒

再看我們取最初一頁記載的時光
select * from product limit 866613, 20 37.44秒

難怪搜刮引擎抓取我們頁面的時刻常常會報超時,像這類分頁最年夜的頁碼頁明顯這類時
間是沒法忍耐的。

從中我們也能總結出兩件工作:
1)limit語句的查詢時光與肇端記載的地位成反比
2)mysql的limit語句是很便利,然則對記載許多的表其實不合適直接應用。

2. 對limit分頁成績的機能優化辦法

應用表的籠罩索引來加快分頁查詢
我們都曉得,應用了索引查詢的語句中假如只包括了誰人索引列(籠罩索引),那末這類情形會查詢很快。

由於應用索引查找有優化算法,且數據就在查詢索引下面,不消再去找相干的數據地址了,如許節儉了許多時光。別的Mysql中也有相干的索引緩存,在並發高的時刻應用緩存就後果更好了。

在我們的例子中,我們曉得id字段是主鍵,天然就包括了默許的主鍵索引。如今讓我們看看應用籠罩索引的查詢後果若何:

此次我們之間查詢最初一頁的數據(應用籠罩索引,只包括id列),以下:
select id from product limit 866613, 20 0.2秒
絕對於查詢了一切列的37.44秒,晉升了年夜概100多倍的速度

那末假如我們也要查詢一切列,有兩種辦法,一種是id>=的情勢,另外一種就是應用join,看下現實情形:

SELECT * FROM product WHERE ID > =(select id from product limit 866613, 1) limit 20
查詢時光為0.2秒,的確是一個質的奔騰啊,哈哈

另外一種寫法
SELECT * FROM product a JOIN (select id from product limit 866613, 20) b ON a.ID = b.id
查詢時光也很短,贊!

其實二者用的都是一個道理嘛,所以後果也差不多

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