婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁(yè) > 知識(shí)庫(kù) > MySQL百萬(wàn)級(jí)數(shù)據(jù)量分頁(yè)查詢方法及其優(yōu)化建議

MySQL百萬(wàn)級(jí)數(shù)據(jù)量分頁(yè)查詢方法及其優(yōu)化建議

熱門標(biāo)簽:新鄉(xiāng)智能外呼系統(tǒng)好處 石家莊400電話辦理公司 申請(qǐng)400電話電話價(jià)格 許昌外呼增值業(yè)務(wù)線路 臨沂做地圖標(biāo)注 廣東400企業(yè)電話申請(qǐng)流程 宜賓全自動(dòng)外呼系統(tǒng)廠家 地圖標(biāo)注客戶付款 咸陽(yáng)防封電銷卡

數(shù)據(jù)庫(kù)SQL優(yōu)化是老生常談的問題,在面對(duì)百萬(wàn)級(jí)數(shù)據(jù)量的分頁(yè)查詢,又有什么好的優(yōu)化建議呢?下面將列舉了一些常用的方法,供大家參考學(xué)習(xí)!

方法1: 直接使用數(shù)據(jù)庫(kù)提供的SQL語(yǔ)句

  • 語(yǔ)句樣式: MySQL中,可用如下方法: SELECT * FROM 表名稱 LIMIT M,N
  • 適應(yīng)場(chǎng)景: 適用于數(shù)據(jù)量較少的情況(元組百/千級(jí))
  • 原因/缺點(diǎn): 全表掃描,速度會(huì)很慢 且 有的數(shù)據(jù)庫(kù)結(jié)果集返回不穩(wěn)定(如某次返回1,2,3,另外的一次返回2,1,3). Limit限制的是從結(jié)果集的M位置處取出N條輸出,其余拋棄.

方法2: 建立主鍵或唯一索引, 利用索引(假設(shè)每頁(yè)10條)

  • 語(yǔ)句樣式: MySQL中,可用如下方法: SELECT * FROM 表名稱 WHERE id_pk > (pageNum*10) LIMIT M
  • 適應(yīng)場(chǎng)景: 適用于數(shù)據(jù)量多的情況(元組數(shù)上萬(wàn))
  • 原因: 索引掃描,速度會(huì)很快. 有朋友提出: 因?yàn)閿?shù)據(jù)查詢出來(lái)并不是按照pk_id排序的,所以會(huì)有漏掉數(shù)據(jù)的情況,只能方法3

方法3: 基于索引再排序

  • 語(yǔ)句樣式: MySQL中,可用如下方法: SELECT * FROM 表名稱 WHERE id_pk > (pageNum*10) ORDER BY id_pk ASC LIMIT M
  • 適應(yīng)場(chǎng)景: 適用于數(shù)據(jù)量多的情況(元組數(shù)上萬(wàn)). 最好ORDER BY后的列對(duì)象是主鍵或唯一所以,使得ORDERBY操作能利用索引被消除但結(jié)果集是穩(wěn)定的(穩(wěn)定的含義,參見方法1)
  • 原因: 索引掃描,速度會(huì)很快. 但MySQL的排序操作,只有ASC沒有DESC(DESC是假的,未來(lái)會(huì)做真正的DESC,期待...).

方法4: 基于索引使用prepare

第一個(gè)問號(hào)表示pageNum,第二個(gè)?表示每頁(yè)元組數(shù)

  • 語(yǔ)句樣式: MySQL中,可用如下方法: PREPARE stmt_name FROM SELECT * FROM 表名稱 WHERE id_pk > (?* ?) ORDER BY id_pk ASC LIMIT M
  • 適應(yīng)場(chǎng)景: 大數(shù)據(jù)量
  • 原因: 索引掃描,速度會(huì)很快. prepare語(yǔ)句又比一般的查詢語(yǔ)句快一點(diǎn)。

方法5: 利用MySQL支持ORDER操作可以利用索引快速定位部分元組,避免全表掃描

比如: 讀第1000到1019行元組(pk是主鍵/唯一鍵).

SELECT * FROM your_table WHERE pk>=1000 ORDER BY pk ASC LIMIT 0,20

方法6: 利用子查詢/連接+索引快速定位元組的位置,然后再讀取元組.

比如(id是主鍵/唯一鍵,藍(lán)色字體時(shí)變量)

利用子查詢示例:

SELECT * FROM your_table WHERE id =
(SELECT id FROM your_table ORDER BY id desc LIMIT ($page-1)*$pagesize ORDER BY id desc
LIMIT $pagesize

利用連接示例:

SELECT * FROM your_table AS t1
JOIN (SELECT id FROM your_table ORDER BY id desc LIMIT ($page-1)*$pagesize AS t2
WHERE t1.id = t2.id ORDER BY t1.id desc LIMIT $pagesize;

mysql大數(shù)據(jù)量使用limit分頁(yè),隨著頁(yè)碼的增大,查詢效率越低下。

測(cè)試實(shí)驗(yàn)

1. 直接用limit start, count分頁(yè)語(yǔ)句, 也是我程序中用的方法:

select * from product limit start, count

當(dāng)起始頁(yè)較小時(shí),查詢沒有性能問題,我們分別看下從10, 100, 1000, 10000開始分頁(yè)的執(zhí)行時(shí)間(每頁(yè)取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秒

我們已經(jīng)看出隨著起始記錄的增加,時(shí)間也隨著增大, 這說(shuō)明分頁(yè)語(yǔ)句limit跟起始頁(yè)碼是有很大關(guān)系的,那么我們把起始記錄改為40w看下(也就是記錄的一般左右)

select * from product limit 400000, 20 3.229秒

再看我們?nèi)∽詈笠豁?yè)記錄的時(shí)間

select * from product limit 866613, 20 37.44秒

像這種分頁(yè)最大的頁(yè)碼頁(yè)顯然這種時(shí)間是無(wú)法忍受的。

從中我們也能總結(jié)出兩件事情:

  1. limit語(yǔ)句的查詢時(shí)間與起始記錄的位置成正比
  2. mysql的limit語(yǔ)句是很方便,但是對(duì)記錄很多的表并不適合直接使用。

2. 對(duì)limit分頁(yè)問題的性能優(yōu)化方法

利用表的覆蓋索引來(lái)加速分頁(yè)查詢

我們都知道,利用了索引查詢的語(yǔ)句中如果只包含了那個(gè)索引列(覆蓋索引),那么這種情況會(huì)查詢很快。

因?yàn)槔盟饕檎矣袃?yōu)化算法,且數(shù)據(jù)就在查詢索引上面,不用再去找相關(guān)的數(shù)據(jù)地址了,這樣節(jié)省了很多時(shí)間。另外Mysql中也有相關(guān)的索引緩存,在并發(fā)高的時(shí)候利用緩存就效果更好了。

在我們的例子中,我們知道id字段是主鍵,自然就包含了默認(rèn)的主鍵索引。現(xiàn)在讓我們看看利用覆蓋索引的查詢效果如何。

這次我們之間查詢最后一頁(yè)的數(shù)據(jù)(利用覆蓋索引,只包含id列),如下:

select id from product limit 866613, 20 0.2秒

相對(duì)于查詢了所有列的37.44秒,提升了大概100多倍的速度

那么如果我們也要查詢所有列,有兩種方法,一種是id>=的形式,另一種就是利用join,看下實(shí)際情況:

SELECT * FROM product WHERE ID > =(select id from product limit 866613, 1) limit 20

查詢時(shí)間為0.2秒!

另一種寫法

SELECT * FROM product a JOIN (select id from product limit 866613, 20) b ON a.ID = b.id

查詢時(shí)間也很短!

3. 復(fù)合索引優(yōu)化方法

MySql 性能到底能有多高?MySql 這個(gè)數(shù)據(jù)庫(kù)絕對(duì)是適合dba級(jí)的高手去玩的,一般做一點(diǎn)1萬(wàn)篇新聞的小型系統(tǒng)怎么寫都可以,用xx框架可以實(shí)現(xiàn)快速開發(fā)。可是數(shù)據(jù)量到了10萬(wàn),百萬(wàn)至千萬(wàn),他的性能還能那么高嗎?一點(diǎn)小小的失誤,可能造成整個(gè)系統(tǒng)的改寫,甚至更本系統(tǒng)無(wú)法正常運(yùn)行!好了,不那么多廢話了。

用事實(shí)說(shuō)話,看例子:

數(shù)據(jù)表 collect ( id, title ,info ,vtype) 就這4個(gè)字段,其中 title 用定長(zhǎng),info 用text, id 是逐漸,vtype是tinyint,vtype是索引。這是一個(gè)基本的新聞系統(tǒng)的簡(jiǎn)單模型。現(xiàn)在往里面填充數(shù)據(jù),填充10萬(wàn)篇新聞。最后collect 為 10萬(wàn)條記錄,數(shù)據(jù)庫(kù)表占用硬1.6G。

OK ,看下面這條sql語(yǔ)句:

select id,title from collect limit 1000,10;

很快;基本上0.01秒就OK,再看下面的

select id,title from collect limit 90000,10;

從9萬(wàn)條開始分頁(yè),結(jié)果?

8-9秒完成,my god 哪出問題了?其實(shí)要優(yōu)化這條數(shù)據(jù),網(wǎng)上找得到答案。看下面一條語(yǔ)句:

select id from collect order by id limit 90000,10;

很快,0.04秒就OK。為什么?因?yàn)橛昧薸d主鍵做索引當(dāng)然快。網(wǎng)上的改法是:

select id,title from collect where id>=(select id from collect order by id limit 90000,1) limit 10;

這就是用了id做索引的結(jié)果。可是問題復(fù)雜那么一點(diǎn)點(diǎn),就完了。看下面的語(yǔ)句

select id from collect where vtype=1 order by id limit 90000,10; 

很慢,用了8-9秒!

到了這里我相信很多人會(huì)和我一樣,有崩潰感覺!vtype 做了索引了啊?怎么會(huì)慢呢?vtype做了索引是不錯(cuò),你直接

select id from collect where vtype=1 limit 1000,10;

是很快的,基本上0.05秒,可是提高90倍,從9萬(wàn)開始,那就是0.05*90=4.5秒的速度了。和測(cè)試結(jié)果8-9秒到了一個(gè)數(shù)量級(jí)。

從這里開始有人提出了分表的思路,這個(gè)和dis #cuz 論壇是一樣的思路。思路如下:

建一個(gè)索引表:t (id,title,vtype) 并設(shè)置成定長(zhǎng),然后做分頁(yè),分頁(yè)出結(jié)果再到 collect 里面去找info 。是否可行呢?實(shí)驗(yàn)下就知道了。

10萬(wàn)條記錄到 t(id,title,vtype) 里,數(shù)據(jù)表大小20M左右。用

select id from collect where vtype=1 limit 1000,10;

很快了。基本上0.1-0.2秒可以跑完。為什么會(huì)這樣呢?我猜想是因?yàn)閏ollect 數(shù)據(jù)太多,所以分頁(yè)要跑很長(zhǎng)的路。limit 完全和數(shù)據(jù)表的大小有關(guān)的。其實(shí)這樣做還是全表掃描,只是因?yàn)閿?shù)據(jù)量小,只有10萬(wàn)才快。OK, 來(lái)個(gè)瘋狂的實(shí)驗(yàn),加到100萬(wàn)條,測(cè)試性能。加了10倍的數(shù)據(jù),馬上t表就到了200多M,而且是定長(zhǎng)。還是剛才的查詢語(yǔ)句,時(shí)間是0.1-0.2秒完成!分表性能沒問題?

錯(cuò)!因?yàn)槲覀兊膌imit還是9萬(wàn),所以快。給個(gè)大的,90萬(wàn)開始

select id from t where vtype=1 order by id limit 900000,10;

看看結(jié)果,時(shí)間是1-2秒!why ?

分表了時(shí)間還是這么長(zhǎng),非常之郁悶!有人說(shuō)定長(zhǎng)會(huì)提高limit的性能,開始我也以為,因?yàn)橐粭l記錄的長(zhǎng)度是固定的,mysql 應(yīng)該可以算出90萬(wàn)的位置才對(duì)啊?可是我們高估了mysql 的智能,他不是商務(wù)數(shù)據(jù)庫(kù),事實(shí)證明定長(zhǎng)和非定長(zhǎng)對(duì)limit影響不大?怪不得有人說(shuō)discuz到了100萬(wàn)條記錄就會(huì)很慢,我相信這是真的,這個(gè)和數(shù)據(jù)庫(kù)設(shè)計(jì)有關(guān)!

難道MySQL 無(wú)法突破100萬(wàn)的限制嗎???到了100萬(wàn)的分頁(yè)就真的到了極限?

答案是:NO 為什么突破不了100萬(wàn)是因?yàn)椴粫?huì)設(shè)計(jì)mysql造成的。下面介紹非分表法,來(lái)個(gè)瘋狂的測(cè)試!一張表搞定100萬(wàn)記錄,并且10G 數(shù)據(jù)庫(kù),如何快速分頁(yè)!

好了,我們的測(cè)試又回到 collect表,開始測(cè)試結(jié)論是:

30萬(wàn)數(shù)據(jù),用分表法可行,超過(guò)30萬(wàn)他的速度會(huì)慢道你無(wú)法忍受!當(dāng)然如果用分表+我這種方法,那是絕對(duì)完美的。但是用了我這種方法后,不用分表也可以完美解決!

答案就是:復(fù)合索引!有一次設(shè)計(jì)mysql索引的時(shí)候,無(wú)意中發(fā)現(xiàn)索引名字可以任取,可以選擇幾個(gè)字段進(jìn)來(lái),這有什么用呢?

開始的

select id from collect order by id limit 90000,10;

這么快就是因?yàn)樽吡怂饕墒侨绻恿藈here 就不走索引了。抱著試試看的想法加了 search(vtype,id) 這樣的索引。

然后測(cè)試

select id from collect where vtype=1 limit 90000,10;

非常快!0.04秒完成!

再測(cè)試:

select id ,title from collect where vtype=1 limit 90000,10;

非常遺憾,8-9秒,沒走search索引!

再測(cè)試:search(id,vtype),還是select id 這個(gè)語(yǔ)句,也非常遺憾,0.5秒。

綜上:如果對(duì)于有where 條件,又想走索引用limit的,必須設(shè)計(jì)一個(gè)索引,將where 放第一位,limit用到的主鍵放第2位,而且只能select 主鍵!

完美解決了分頁(yè)問題了。可以快速返回id就有希望優(yōu)化limit , 按這樣的邏輯,百萬(wàn)級(jí)的limit 應(yīng)該在0.0x秒就可以分完。看來(lái)mysql 語(yǔ)句的優(yōu)化和索引時(shí)非常重要的!

以上就是MySQL百萬(wàn)級(jí)數(shù)據(jù)量分頁(yè)查詢方法及其優(yōu)化建議的詳細(xì)內(nèi)容,更多關(guān)于MySQL分頁(yè)查詢及其優(yōu)化的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:
  • php頁(yè)面,mysql數(shù)據(jù)庫(kù)轉(zhuǎn)utf-8亂碼,utf-8編碼問題總結(jié)
  • 在MySQL中使用LIMIT進(jìn)行分頁(yè)的方法
  • 修改Innodb的數(shù)據(jù)頁(yè)大小以優(yōu)化MySQL的方法
  • Spring MVC+MyBatis+MySQL實(shí)現(xiàn)分頁(yè)功能實(shí)例
  • nodejs mysql 實(shí)現(xiàn)分頁(yè)的方法
  • 詳解MySQL的limit用法和分頁(yè)查詢語(yǔ)句的性能分析
  • php+mysql實(shí)現(xiàn)簡(jiǎn)單登錄注冊(cè)修改密碼網(wǎng)頁(yè)
  • MySQL百萬(wàn)級(jí)數(shù)據(jù)分頁(yè)查詢優(yōu)化方案
  • Mysql排序和分頁(yè)(order by&limit)及存在的坑
  • 淺談MySQL之淺入深出頁(yè)原理

標(biāo)簽:合肥 貴州 日照 北京 臺(tái)灣 鎮(zhèn)江 阜新 鷹潭

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《MySQL百萬(wàn)級(jí)數(shù)據(jù)量分頁(yè)查詢方法及其優(yōu)化建議》,本文關(guān)鍵詞  MySQL,百萬(wàn),級(jí),數(shù)據(jù),量,分頁(yè),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《MySQL百萬(wàn)級(jí)數(shù)據(jù)量分頁(yè)查詢方法及其優(yōu)化建議》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于MySQL百萬(wàn)級(jí)數(shù)據(jù)量分頁(yè)查詢方法及其優(yōu)化建議的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    欧美色图一区二区三区| 国产精品午夜电影| 精品国产在天天线2019| 一区二区在线观看不卡| 久久国产福利国产秒拍| 日韩一区二区三区在线| 亚洲国产欧美在线| 精品久久久久av影院| 免费成人美女在线观看.| 欧美精品在线视频| 日韩vs国产vs欧美| 久久久99久久| 91毛片在线观看| 亚洲激情一二三区| 精品久久久久久久人人人人传媒| 蜜桃久久久久久久| 日本一区二区视频在线| 91丨九色丨国产丨porny| 五月天一区二区| 国产精品久久久久久久午夜片| 91麻豆成人久久精品二区三区| 男女男精品网站| 中文字幕在线观看一区| 欧美一区二区人人喊爽| 成人av电影在线网| 美国三级日本三级久久99| 国产女人水真多18毛片18精品视频| 欧美日高清视频| 在线一区二区视频| 国产精品自在欧美一区| 亚洲一区日韩精品中文字幕| 欧美一区二区三区播放老司机| 99久久国产免费看| 成人动漫精品一区二区| 国产精品影视天天线| 麻豆成人av在线| 亚洲成人av在线电影| 中文字幕一区二区三区四区不卡 | 成人高清伦理免费影院在线观看| 肉丝袜脚交视频一区二区| 亚洲视频免费看| 亚洲视频香蕉人妖| 亚洲成av人影院| 亚洲18色成人| 久久电影网电视剧免费观看| 国产电影精品久久禁18| 99久久99久久综合| 日韩三级视频在线看| 国产日产欧美一区| 亚洲一级片在线观看| 日本欧美一区二区在线观看| 久久97超碰色| 91在线国产福利| 日韩你懂的电影在线观看| 欧美国产日本韩| 日韩精品乱码免费| 国产精品资源在线| 欧美美女视频在线观看| 26uuu欧美日本| 视频一区国产视频| 色网站国产精品| 国产欧美日韩亚州综合 | 蜜乳av一区二区三区| 国产精品综合在线视频| 日本韩国一区二区| 亚洲国产精品传媒在线观看| 全部av―极品视觉盛宴亚洲| 91丨porny丨在线| 日韩理论片中文av| 美女网站色91| 91精品国产综合久久国产大片| 亚洲天堂2016| 波多野结衣亚洲一区| 久久精品亚洲一区二区三区浴池| 久久精品国产成人一区二区三区| 色视频欧美一区二区三区| 久久久久久久久久久久电影| 久久成人av少妇免费| 日韩一区二区视频在线观看| 奇米精品一区二区三区在线观看一| 欧美在线制服丝袜| 日韩欧美国产wwwww| 狠狠色伊人亚洲综合成人| 国产亚洲欧美色| 色哟哟国产精品免费观看| 午夜精品久久一牛影视| 日韩午夜在线观看视频| 激情偷乱视频一区二区三区| 久久久.com| 色婷婷综合五月| 久久激情综合网| 夜色激情一区二区| 精品少妇一区二区三区日产乱码| 成人激情电影免费在线观看| 91麻豆免费观看| 洋洋成人永久网站入口| 久久精品人人做人人爽人人| 色综合久久中文字幕| 日本视频免费一区| 国产精品国产馆在线真实露脸| 欧美日韩成人高清| 欧日韩精品视频| 亚洲电影在线免费观看| 亚洲一区二区三区四区的| 91麻豆产精品久久久久久| 狠狠色丁香婷婷综合| 秋霞电影网一区二区| 亚洲国产成人精品视频| 日韩一区在线播放| 中文字幕人成不卡一区| 国产亚洲欧美色| 欧美国产禁国产网站cc| 久久精品夜色噜噜亚洲a∨| 欧美大胆一级视频| 91精品国产欧美一区二区| 欧美在线一二三| 喷水一区二区三区| 另类小说综合欧美亚洲| 免费高清成人在线| 国产麻豆91精品| 美女视频第一区二区三区免费观看网站| 国产欧美精品区一区二区三区| 欧美在线不卡视频| 一本大道久久a久久精二百| 欧美色图天堂网| 久久精品人人爽人人爽| 精品国产伦理网| 欧美高清在线视频| 亚洲精品网站在线观看| 99国产精品久久久| 一本大道久久a久久综合| 欧美三级三级三级| 精品国产污污免费网站入口| 国产精品萝li| 黄一区二区三区| 9191成人精品久久| 国产精品国产精品国产专区不蜜 | 欧美综合在线视频| 一本到三区不卡视频| 色94色欧美sute亚洲线路一ni| 日本高清免费不卡视频| 欧美色图12p| 亚洲男人都懂的| 中文无字幕一区二区三区| 捆绑调教美女网站视频一区| www.色精品| 欧洲视频一区二区| 国产性色一区二区| 国产一区二区不卡老阿姨| 欧美mv和日韩mv国产网站| 亚洲欧美成人一区二区三区| 91免费视频大全| 亚洲精品成人a在线观看| 久久99精品久久久久| 制服丝袜亚洲网站| av在线不卡免费看| 国产亚洲一区二区在线观看| 亚洲不卡一区二区三区| 欧美性三三影院| 亚洲日本va在线观看| 美女视频黄久久| 国产调教视频一区| av在线播放成人| 日韩**一区毛片| 欧美精品一卡二卡| 日本视频免费一区| 欧美精品vⅰdeose4hd| 亚洲成av人片一区二区| 欧美嫩在线观看| 日本欧洲一区二区| 日韩欧美电影在线| 久草热8精品视频在线观看| 欧美一区二区三区四区视频| 亚洲不卡av一区二区三区| 欧美色视频一区| 精品一区免费av| 亚洲蜜臀av乱码久久精品| 在线观看一区不卡| 成人网在线播放| 亚洲国产精品一区二区久久恐怖片 | 欧美国产激情一区二区三区蜜月| 成人毛片视频在线观看| 久久福利视频一区二区| 亚洲国产精品久久人人爱蜜臀| 久久久久9999亚洲精品| 国产女人18水真多18精品一级做| 欧美二区三区91| 日韩欧美国产三级电影视频| 色域天天综合网| 欧美色视频在线观看| 欧美特级限制片免费在线观看| 成人国产在线观看| 91一区在线观看| 欧美日韩免费在线视频| 欧美亚州韩日在线看免费版国语版| 99九九99九九九视频精品| 久久电影网站中文字幕| 成人福利视频在线看| 日本乱码高清不卡字幕| 欧美色偷偷大香|