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

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

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

熱門(mén)標(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)防封電銷(xiāo)卡

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

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

  • 語(yǔ)句樣式: MySQL中,可用如下方法: SELECT * FROM 表名稱(chēng) 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 表名稱(chēng) 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 表名稱(chēng) 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)定的含義,參見(jiàn)方法1)
  • 原因: 索引掃描,速度會(huì)很快. 但MySQL的排序操作,只有ASC沒(méi)有DESC(DESC是假的,未來(lái)會(huì)做真正的DESC,期待...).

方法4: 基于索引使用prepare

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

  • 語(yǔ)句樣式: MySQL中,可用如下方法: PREPARE stmt_name FROM SELECT * FROM 表名稱(chēng) 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í),查詢沒(méi)有性能問(wèn)題,我們分別看下從10, 100, 1000, 10000開(kāi)始分頁(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è)問(wèn)題的性能優(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秒!

另一種寫(xiě)法

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)怎么寫(xiě)都可以,用xx框架可以實(shí)現(xiàn)快速開(kāi)發(fā)。可是數(shù)據(jù)量到了10萬(wàn),百萬(wàn)至千萬(wàn),他的性能還能那么高嗎?一點(diǎn)小小的失誤,可能造成整個(gè)系統(tǒng)的改寫(xiě),甚至更本系統(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)條開(kāi)始分頁(yè),結(jié)果?

8-9秒完成,my god 哪出問(wèn)題了?其實(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é)果。可是問(wèn)題復(fù)雜那么一點(diǎn)點(diǎn),就完了。看下面的語(yǔ)句

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

很慢,用了8-9秒!

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

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

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

從這里開(kāi)始有人提出了分表的思路,這個(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秒完成!分表性能沒(méi)問(wèn)題?

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

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的性能,開(kāi)始我也以為,因?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表,開(kāi)始測(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),這有什么用呢?

開(kā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秒,沒(méi)走search索引!

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

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

完美解決了分頁(yè)問(wèn)題了。可以快速返回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編碼問(wèn)題總結(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)問(wè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)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于MySQL百萬(wàn)級(jí)數(shù)據(jù)量分頁(yè)查詢方法及其優(yōu)化建議的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    中文字幕中文字幕在线一区| 久久久久久亚洲综合| 一区二区三区加勒比av| 国产精品国产自产拍高清av | 在线视频一区二区三| 亚洲va天堂va国产va久| 精品久久久久久久久久久久久久久 | 欧美亚洲国产一区二区三区va| 艳妇臀荡乳欲伦亚洲一区| 亚洲欧美日韩综合aⅴ视频| 欧美日韩一区高清| 一二三四区精品视频| 国内精品国产成人| 欧美成va人片在线观看| 秋霞成人午夜伦在线观看| www.性欧美| 亚洲国产成人精品视频| 精品av久久707| 777午夜精品视频在线播放| 国产精品夜夜嗨| 午夜精品123| 一区二区三区在线视频免费| 久久综合五月天婷婷伊人| 色综合一区二区三区| 国内偷窥港台综合视频在线播放| 亚洲欧美另类综合偷拍| 久久精品网站免费观看| 91精品国产综合久久久久| 色天天综合色天天久久| 久久er99精品| 婷婷久久综合九色综合伊人色| 亚洲18色成人| 国产在线一区观看| 在线免费观看日本欧美| 国产精品麻豆99久久久久久| 欧美区一区二区三区| 欧美日本乱大交xxxxx| 欧美色图片你懂的| 欧美美女直播网站| 日韩一区二区免费高清| 欧美一区二区美女| 久久精品亚洲精品国产欧美kt∨| 中文字幕精品在线不卡| 中文字幕一区av| 亚洲综合激情小说| 亚洲一二三四在线| 日本不卡一区二区三区高清视频| 日韩av一级电影| 99这里只有精品| 91精品综合久久久久久| 久久久久国产精品人| 国产91色综合久久免费分享| 欧美国产日韩精品免费观看| 99久久精品久久久久久清纯| 中文字幕欧美一| 91福利在线观看| 日韩精品乱码av一区二区| 欧美一级二级在线观看| 免费精品99久久国产综合精品| 91麻豆精品国产91久久久 | 麻豆精品国产传媒mv男同| 久久久一区二区三区捆绑**| 韩国毛片一区二区三区| 99久久精品免费看国产| 国产日韩亚洲欧美综合| 国内精品视频666| 欧美成人猛片aaaaaaa| 日韩高清不卡在线| 欧美日韩aaa| 肉丝袜脚交视频一区二区| 91黄色小视频| 亚洲成人免费在线观看| 色狠狠桃花综合| 免费三级欧美电影| 91麻豆精品国产91久久久更新时间 | 成人久久久精品乱码一区二区三区| 亚洲精品一区二区三区影院| 国产·精品毛片| 蜜乳av一区二区三区| 国产婷婷色一区二区三区四区| 国产欧美一区二区精品性| 日日夜夜免费精品| 日韩欧美成人一区| 国产精品一二二区| 中文字幕一区二区三区色视频| 成人aaaa免费全部观看| 一区二区三区在线不卡| 制服丝袜中文字幕一区| 理论电影国产精品| 亚洲国产精华液网站w| 欧美在线视频全部完| 久久国产夜色精品鲁鲁99| 国产亚洲欧美日韩日本| 欧美亚洲图片小说| 国产盗摄精品一区二区三区在线 | 欧美tickle裸体挠脚心vk| 国产福利精品一区| 午夜精品久久一牛影视| 亚洲国产精品成人久久综合一区| 一本久久a久久精品亚洲| 国产精品一品二品| 久久国产精品99久久久久久老狼| 亚洲欧洲一区二区三区| 日韩欧美电影在线| 欧美日韩一区三区| 99久久精品国产网站| 韩国成人在线视频| 日本特黄久久久高潮| 亚洲一区二区三区视频在线 | 成人av资源网站| 精品一区免费av| 久久激情五月婷婷| 天天爽夜夜爽夜夜爽精品视频| 亚洲欧洲中文日韩久久av乱码| 欧美大片在线观看一区二区| 911国产精品| 欧美一级理论性理论a| 日韩一区二区麻豆国产| 91精品国产色综合久久不卡电影 | 天天操天天综合网| 天天影视涩香欲综合网| 天天色天天爱天天射综合| 午夜欧美电影在线观看| 悠悠色在线精品| 视频在线观看一区二区三区| 午夜精品久久久久久| 日本亚洲视频在线| 成人免费视频免费观看| 欧美性猛交xxxxxx富婆| 欧美电影免费观看高清完整版 | 欧美日韩国产高清一区二区| 欧美猛男超大videosgay| 国产调教视频一区| 香蕉影视欧美成人| 国产乱码字幕精品高清av| 91亚洲资源网| 久久久精品天堂| 秋霞成人午夜伦在线观看| 国产乱码精品一区二区三区av | 国产片一区二区| 亚洲一级在线观看| 成人性生交大片免费看中文 | 国产精品无圣光一区二区| 亚洲国产cao| 欧美在线一二三| 亚洲少妇30p| 91色视频在线| 国产欧美日韩三级| 国产福利精品导航| 欧美精品一区二区久久婷婷| 五月婷婷激情综合| 欧美色图天堂网| ●精品国产综合乱码久久久久| 黄一区二区三区| 久久综合资源网| 狠狠网亚洲精品| 3d成人h动漫网站入口| 亚洲资源在线观看| 欧美色偷偷大香| 亚洲精品你懂的| av中文字幕一区| 在线观看一区二区精品视频| 精品久久久久久亚洲综合网| 亚洲乱码国产乱码精品精可以看| 亚洲大片免费看| 国产福利一区二区三区视频在线| 国产做a爰片久久毛片| 色一区在线观看| 久久久久久99精品| 日韩欧美另类在线| 国产日韩精品一区| 国产精品电影一区二区三区| 一区二区三区中文字幕在线观看| 日韩精品一区第一页| 国产麻豆精品视频| 91久久精品一区二区二区| 国产九九视频一区二区三区| 国产日韩欧美制服另类| 99综合影院在线| 精品免费一区二区三区| 青青国产91久久久久久| 欧美视频在线一区| 日本 国产 欧美色综合| 欧美久久久久久久久中文字幕| 日韩在线一区二区三区| 欧美另类高清zo欧美| 国产精品久久久久7777按摩| 国产精品一区二区黑丝| 亚洲欧美电影院| 欧美久久高跟鞋激| 波多野结衣中文一区| 极品美女销魂一区二区三区免费| 国产精品青草久久| 欧美一级理论片| 日本韩国一区二区三区| 成人动漫中文字幕| 福利一区福利二区| 亚洲bt欧美bt精品| 青青青伊人色综合久久| 樱桃视频在线观看一区|