最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL Limit性能優(yōu)化及分頁(yè)數(shù)據(jù)性能優(yōu)化詳解

 更新時(shí)間:2019年03月19日 09:32:16   作者:CODETC  
今天小編就為大家分享一篇關(guān)于MySQL Limit性能優(yōu)化及分頁(yè)數(shù)據(jù)性能優(yōu)化詳解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧

MySQL Limit可以分段查詢數(shù)據(jù)庫(kù)數(shù)據(jù),主要應(yīng)用在分頁(yè)上。雖然現(xiàn)在寫(xiě)的網(wǎng)站數(shù)據(jù)都是千條級(jí)別,一些小的的優(yōu)化起的作用不大,但是開(kāi)發(fā)就要做到極致,追求完美性能。下面記錄一些limit性能優(yōu)化方法。

Limit語(yǔ)法:

SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset

LIMIT子句可以被用于強(qiáng)制 SELECT 語(yǔ)句返回指定的記錄數(shù)。LIMIT接受一個(gè)或兩個(gè)數(shù)字參數(shù)。參數(shù)必須是一個(gè)整數(shù)常量。

如果給定兩個(gè)參數(shù),第一個(gè)參數(shù)指定第一個(gè)返回記錄行的偏移量,第二個(gè)參數(shù)指定返回記錄行的最大數(shù)目。初始記錄行的偏移量是 0(而不是 1)。

支持 limit # offset # 語(yǔ)法:

mysql> SELECT * FROM table LIMIT 5,10; //檢索記錄行6-15
//為了檢索從某一個(gè)偏移量到記錄集的結(jié)束所有的記錄行,可以指定第二個(gè)參數(shù)為-1
mysql> SELECT * FROM table LIMIT 95,-1; //檢索記錄行96-last
//如果只給定一個(gè)參數(shù),它表示返回最大的記錄行數(shù)目,換句話說(shuō),LIMIT n 等價(jià)于 LIMIT 0,n
mysql> SELECT * FROM table LIMIT 5; //檢索前5個(gè)記錄行

limit n,m 表示從第n條記錄開(kāi)始選擇m條記錄。而大多數(shù)開(kāi)發(fā)人員喜歡使用這類(lèi)語(yǔ)句來(lái)解決Web中經(jīng)典的分頁(yè)問(wèn)題。對(duì)于小規(guī)模的數(shù)據(jù),這并不會(huì)有太大的問(wèn)題。對(duì)于論壇這類(lèi)可能具有非常大規(guī)模數(shù)據(jù)的應(yīng)用來(lái)說(shuō),limit n,m 的效率是十分低的。因?yàn)槊看味夹枰獙?duì)數(shù)據(jù)進(jìn)行選取。如果只是選取前5條記錄,則非常輕松和容易;但是對(duì)100萬(wàn)條記錄,選取從80萬(wàn)行記錄開(kāi)始的5條記錄,則還需要掃描記錄到這個(gè)位置。

也就是說(shuō)limit 10000,20意味著掃描滿足條件的10020行,扔掉前面的10000行,返回最后的20行;問(wèn)題就在這里,如果是limit 100000,100,需要掃描100100行,在一個(gè)高并發(fā)的應(yīng)用里,每次查詢需要掃描超過(guò)10W行,性能肯定大打折扣。

不同數(shù)據(jù)量讀取數(shù)據(jù)效率比較:

1.offset比較小的時(shí)候:

select * from table limit 5,10

多次運(yùn)行,時(shí)間保持在0.0004-0.0005之間

Select * From table Where id >=( 
Select id From table Order By id limit 10,1 
) limit 10

多次運(yùn)行,時(shí)間保持在0.0005-0.0006之間。所有,在offset較小的時(shí)候,直接使用limit效率會(huì)高點(diǎn)!

2.offset數(shù)據(jù)比較大的時(shí)候:

select * from table limit 10000,10

多次運(yùn)行,時(shí)間保持在0.0187秒左右。

Select * From table Where id >=( 
Select id From table Order By id limit 10000,1 
) limit 10

多次運(yùn)行,時(shí)間保持在0.061秒左右,是前者的1/3左右。所以,offset較大時(shí),使用后者效率會(huì)搞!這是用了id做索引的結(jié)果。

如果用id作為數(shù)據(jù)表的主鍵:

select id from table limit 10000,10

查詢花費(fèi)時(shí)間大概在0.04秒,這是因?yàn)橛胕d主鍵作為索引的結(jié)果。

Limit性能優(yōu)化:

Select * From cyclopedia Where ID>=( 
Select Max(ID) From ( 
Select ID From cyclopedia Order By ID limit 90001 
) As tmp 
) limit 100; 
Select * From cyclopedia Where ID>=( 
Select Max(ID) From ( 
Select ID From cyclopedia Order By ID limit 90000,1 
) As tmp 
) limit 100;

同樣是取90000條后100條記錄,第2句會(huì)快點(diǎn)。因?yàn)榈?句是先取前90001條記錄,取其中最大一個(gè)ID值作為起始標(biāo)識(shí),然后利用它快速定位下100條數(shù)據(jù);而第2句是只取了最后一條記錄,然后取ID值作為起始標(biāo)識(shí)定位100條記錄。第2句可簡(jiǎn)寫(xiě)成:

Select * From cyclopedia Where ID>=( 
Select ID From ( 
Select ID From cyclopedia Order By ID limit 90000,1 
) As tmp 
) limit 100;

省去Max運(yùn)算,一般ID都是遞增。

分頁(yè)數(shù)據(jù)性能優(yōu)化:

1、對(duì)于數(shù)據(jù)量較大數(shù)據(jù)表,可以建立主鍵和索引字段建立索引表,通過(guò)索引表查詢相應(yīng)的主鍵,在通過(guò)主鍵查詢數(shù)據(jù)量的數(shù)據(jù)表;

2、如果對(duì)于有where 條件,又想走索引用limit的,必須設(shè)計(jì)一個(gè)索引,將where 放第一位,limit用到的主鍵放第2位,而且只能select 主鍵!這樣能提高讀取速度

3、利用in:先通過(guò)where條件取得相應(yīng)的主鍵值,然后利用主鍵值查詢相應(yīng)的字段值。

使用游標(biāo)(cursor)分頁(yè):

為讓mysql達(dá)到最佳查詢性能,我將分頁(yè)查詢改為cursor查詢方式:

select * from table where id > last_id limit 20 order by reply_id ASC;

上面的last_id為本頁(yè)最后一條記錄的id,這樣就能實(shí)現(xiàn)“下一頁(yè)”的查詢了,同理也可以實(shí)現(xiàn)“上一頁(yè)”的查詢。

cursor方式分頁(yè)只適合用于有順序的數(shù)據(jù)且不支持跳頁(yè),我們可以建立自增ID或向數(shù)據(jù)表中增加有序字段:對(duì)于數(shù)據(jù)量大的項(xiàng)目,跳頁(yè)的作用也不大,完全可以使用篩選條件達(dá)到查找的目的。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接

相關(guān)文章

  • mysql分表之后如何平滑上線詳解

    mysql分表之后如何平滑上線詳解

    項(xiàng)目開(kāi)發(fā)中,我們的數(shù)據(jù)庫(kù)數(shù)據(jù)越來(lái)越大,隨之而來(lái)的是單個(gè)表中數(shù)據(jù)太多,以至于查詢書(shū)讀變慢,當(dāng)出現(xiàn)這種情況時(shí),我們可以考慮分表,這篇文章主要給大家介紹了關(guān)于mysql分表之后如何平滑上線的相關(guān)資料,需要的朋友可以參考下
    2021-10-10
  • mysql開(kāi)啟遠(yuǎn)程連接(mysql開(kāi)啟遠(yuǎn)程訪問(wèn))

    mysql開(kāi)啟遠(yuǎn)程連接(mysql開(kāi)啟遠(yuǎn)程訪問(wèn))

    開(kāi)啟MYSQL遠(yuǎn)程連接權(quán)限的方法,大家參考使用吧
    2013-12-12
  • Mysql大表添加字段失敗問(wèn)題及解決

    Mysql大表添加字段失敗問(wèn)題及解決

    這篇文章主要介紹了Mysql大表添加字段失敗問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • navicat 連接數(shù)據(jù)庫(kù)隔段時(shí)間后自動(dòng)斷開(kāi)連接的解決方案

    navicat 連接數(shù)據(jù)庫(kù)隔段時(shí)間后自動(dòng)斷開(kāi)連接的解決方案

    這篇文章主要介紹了navicat 連接數(shù)據(jù)庫(kù)隔段時(shí)間后自動(dòng)斷開(kāi)連接的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • MySQL如何實(shí)現(xiàn)事務(wù)的ACID

    MySQL如何實(shí)現(xiàn)事務(wù)的ACID

    這篇文章主要介紹了MySQL如何實(shí)現(xiàn)事務(wù)的四大特性,幫助大家更好的理解和學(xué)習(xí)MySQL數(shù)據(jù)庫(kù),感興趣的朋友可以了解下
    2020-09-09
  • MySQL在Windows上安裝的詳細(xì)流程

    MySQL在Windows上安裝的詳細(xì)流程

    MySQL 是最流行的數(shù)據(jù)庫(kù)管理系統(tǒng) (DBMS) 之一,它輕量、開(kāi)源且易于安裝和使用,因此對(duì)于那些剛開(kāi)始學(xué)習(xí)和使用關(guān)系數(shù)據(jù)庫(kù)的人來(lái)說(shuō)是一個(gè)不錯(cuò)的選擇, 本文主要系統(tǒng)介紹Windows的環(huán)境下MySQL的安裝過(guò)程和驗(yàn)證過(guò)程,需要的朋友可以參考下
    2024-12-12
  • Mysql中LAST_INSERT_ID()的函數(shù)使用詳解

    Mysql中LAST_INSERT_ID()的函數(shù)使用詳解

    從名字可以看出,LAST_INSERT_ID即為最后插入的ID值,有了這個(gè)實(shí)用的函數(shù),我們可以實(shí)現(xiàn)很多問(wèn)題,下面我們就來(lái)深入探討下。
    2015-03-03
  • MySQL深分頁(yè)問(wèn)題解決思路

    MySQL深分頁(yè)問(wèn)題解決思路

    這篇文章主要介紹了優(yōu)雅地解決mysql深分頁(yè)問(wèn)題,本文將會(huì)討論當(dāng)mysql表大數(shù)據(jù)量的情況,如何優(yōu)化深分頁(yè)問(wèn)題,并附上最近的優(yōu)化慢sql問(wèn)題的案例偽代碼,需要的朋友可以參考下
    2022-12-12
  • MySQL中的游標(biāo)和綁定變量

    MySQL中的游標(biāo)和綁定變量

    這篇文章主要介紹了MySQL中的游標(biāo)和綁定變量方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • MySQL 轉(zhuǎn)義字符使用說(shuō)明

    MySQL 轉(zhuǎn)義字符使用說(shuō)明

    MySQL 轉(zhuǎn)義字符,大家可以看下,方便以后使用。
    2009-10-10

最新評(píng)論

南岸区| 双峰县| 寻甸| 衡阳县| 望城县| 大新县| 康定县| 龙游县| 荣成市| 平遥县| 乌恰县| 东兰县| 青龙| 融水| 岳西县| 保定市| 通榆县| 繁昌县| 阿荣旗| 抚宁县| 大方县| 石柱| 抚远县| 抚州市| 灵川县| 石林| 贵溪市| 石门县| 喀什市| 武汉市| 苏尼特右旗| 茂名市| 阳朔县| 自贡市| 特克斯县| 天台县| 贡嘎县| 屏南县| 永春县| 若羌县| 高唐县|