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

MySQL百萬級(jí)數(shù)據(jù),怎樣做分頁查詢

 更新時(shí)間:2023年10月26日 10:58:22   作者:ZNineSun  
這篇文章主要介紹了MySQL百萬級(jí)數(shù)據(jù),怎樣做分頁查詢?今天咱們就來聊聊這個(gè)話題,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

MySQL百萬級(jí)數(shù)據(jù),如何做分頁查詢

隨著業(yè)務(wù)的增長(zhǎng),數(shù)據(jù)庫的數(shù)據(jù)也呈指數(shù)級(jí)增長(zhǎng),拿訂單表為例,之前的訂單表每天只有幾千個(gè),一個(gè)月下來不超過十萬。

而現(xiàn)在每天的訂單大概就是2w+,目前訂單表的數(shù)據(jù)已經(jīng)達(dá)到了700w。

這帶來了各種各樣的問題,今天我先從一個(gè)小問題開始。

之前所寫的代碼mysql的分頁都是采用的limit方式進(jìn)行,這種方式固然代碼比較簡(jiǎn)單,但數(shù)據(jù)量大了之后真的是查的慢。

所以此處涉及到mysql大數(shù)據(jù)量后的分頁查詢方法及其優(yōu)化技巧

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

語句樣式: MySQL中,可用如下方法:

SELECT * FROM 表名稱 LIMIT M,N

適應(yīng)場(chǎng)景:適用于數(shù)據(jù)量較少的情況(元組百/千級(jí))

原因/缺點(diǎn):全表掃描,速度會(huì)很慢 且有的數(shù)據(jù)庫結(jié)果集返回不穩(wěn)定(如某次返回1,2,3,另外的一次返回2,1,3)。

Limit限制的是從結(jié)果集的M位置處取出N條輸出,其余拋棄。

再具體進(jìn)行測(cè)試之前,我們需要先創(chuàng)建100w條測(cè)試數(shù)據(jù),推薦使用存儲(chǔ)過程進(jìn)行創(chuàng)建

  • 創(chuàng)建存儲(chǔ)過程
DROP PROCEDURE IF EXISTS create_user_tel;
create procedure create_user_tel() 
begin 
    declare id int; 
    set id=1;
    while id <=1000000
      do 
        INSERT INTO `user01` VALUES(id,  'test123', 'm');
        set id=id+1;
    end while;
end;
  • 執(zhí)行存儲(chǔ)過程
call create_user_tel();

下面開始測(cè)試這種方法


在這里插入圖片描述

可以看到我表里總共80w條數(shù)據(jù),我們看看用這種方法來分頁查詢的耗時(shí)

select * from user01 limit 780000, 20;

在這里插入圖片描述

像這種分頁最大的頁碼頁顯然這種時(shí)間是無法忍受的,同時(shí)大家可以自行測(cè)試一下limit 100 20 ,limit 1000 20,limit 10000 20等所耗費(fèi)的時(shí)間,不難發(fā)現(xiàn)limit語句的查詢時(shí)間與起始記錄的位置成正比

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

語句樣式:MySQL中,可用如下方法:

SELECT id FROM 表名稱 WHERE id > (pageNum*10) LIMIT M
  • 適應(yīng)場(chǎng)景:適用于數(shù)據(jù)量多的情況(元組數(shù)上萬)
  • 原因:索引掃描,速度會(huì)很快。

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

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

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

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

select id from user01 limit 780000, 20;

上面這個(gè)語句只能查詢id,如果我們也要查詢所有列,有兩種方法:

  • 一種是id>=的形式
  • 另一種就是利用join
SELECT * FROM user01 
WHERE id > =(
select id from user01 limit 780000, 1) 
limit 20

另一種寫法

SELECT * FROM user01 a JOIN 
(select id from user01 limit 780000, 20) b 
ON a.id = b.id

自己可以操作一下就會(huì)發(fā)現(xiàn)效率會(huì)大幅度提升,如果你發(fā)現(xiàn)這些語句速度差別不大的話,性能的限制還有可能是你服務(wù)器或自己的電腦性能不足導(dǎo)致的

通過主鍵或者索引的方式去查詢可能會(huì)出現(xiàn)一個(gè)致命的問題就是數(shù)據(jù)查詢出來并不是按照主鍵或者索引排序的,所以會(huì)有漏掉數(shù)據(jù)的情況

這種情況可以通過方法三來解決

方法3:基于索引再排序

語句樣式:MySQL中,可用如下方法:

SELECT * FROM 表名稱 
WHERE id_pk > (pageNum*10) 
ORDER BY id_pk ASC LIMIT M
  • 適應(yīng)場(chǎng)景:適用于數(shù)據(jù)量多的情況(元組數(shù)上萬). 最好ORDER BY后的列對(duì)象是主鍵或唯一索引,使得ORDERBY操作能利用索引被消除但結(jié)果集是穩(wěn)定的(穩(wěn)定的含義,參見方法1)
  • 原因:索引掃描,速度會(huì)很快.
SELECT * FROM user01 
WHERE id >= 780000
ORDER BY id ASC LIMIT 20

在這里插入圖片描述

這種方式會(huì)讓我們的查詢效率得到更大的提升

方法4:基于索引使用prepare

語句樣式:MySQL中,可用如下方法:

PREPARE stmt_name FROM SELECT * FROM 表名稱 WHERE id_pk > (?* ?) ORDER BY id_pk ASC LIMIT M

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

  • 適應(yīng)場(chǎng)景:大數(shù)據(jù)量
  • 原因:索引掃描,速度會(huì)很快。

prepare語句又比一般的查詢語句快一點(diǎn)。

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

比如:讀第1000到1019行數(shù)據(jù)

SELECT * FROM your_table 
WHERE id>=780000 
ORDER BY id ASC 
LIMIT 0,20

在這里插入圖片描述

可以發(fā)現(xiàn)這種效率和上面方法的效率差不多,因?yàn)樾实奶嵘脑蚨际亲遡d主鍵索引

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

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;

我個(gè)人實(shí)驗(yàn)之后發(fā)現(xiàn)效率極其低下

綜上:

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

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Mysql表連接的誤區(qū)與原理詳析

    Mysql表連接的誤區(qū)與原理詳析

    在使用MySQL數(shù)據(jù)庫過程中,left?join?基本是必用的語法,下面這篇文章主要給大家介紹了關(guān)于Mysql表連接的誤區(qū)與原理的相關(guān)資料,需要的朋友可以參考下
    2022-09-09
  • Mysql數(shù)據(jù)庫自增id、uuid與雪花id詳解

    Mysql數(shù)據(jù)庫自增id、uuid與雪花id詳解

    在mysql中設(shè)計(jì)表的時(shí)候,mysql官方推薦不要使用uuid或者不連續(xù)不重復(fù)的雪花id(long形且唯一),而是推薦連續(xù)自增的主鍵id,這篇文章主要給大家介紹了關(guān)于Mysql數(shù)據(jù)庫自增id、uuid與雪花id的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • Windows 64位重裝MySQL的教程(Zip版、解壓版MySQL安裝)

    Windows 64位重裝MySQL的教程(Zip版、解壓版MySQL安裝)

    這篇文章主要介紹了Windows 64位,重裝MySQL的方法(Zip版、解壓版MySQL安裝),本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值需要的朋友可以參考下
    2020-02-02
  • 從基礎(chǔ)語法到最佳實(shí)踐詳解SQL分頁查詢完整指南

    從基礎(chǔ)語法到最佳實(shí)踐詳解SQL分頁查詢完整指南

    在數(shù)據(jù)庫查詢中,分頁(Pagination) 是一項(xiàng)基本且關(guān)鍵的技術(shù),本文將從 SQL分頁的基礎(chǔ)語法 講起,逐步深入探討 不同數(shù)據(jù)庫的分頁實(shí)現(xiàn)方式,有需要的小伙伴可以了解下
    2025-07-07
  • MySQL中CHAR與VARCHAR類型舉例解析

    MySQL中CHAR與VARCHAR類型舉例解析

    在MySQL數(shù)據(jù)庫中CHAR和VARCHAR是兩種常見的字符串?dāng)?shù)據(jù)類型,它們?cè)诖鎯?chǔ)和處理方式上有著顯著的區(qū)別,這篇文章主要介紹了MySQL中CHAR與VARCHAR類型的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-11-11
  • mysql 超大數(shù)據(jù)/表管理技巧

    mysql 超大數(shù)據(jù)/表管理技巧

    在實(shí)際應(yīng)用中經(jīng)過存儲(chǔ)、優(yōu)化可以做到在超過9千萬數(shù)據(jù)中的查詢響應(yīng)速度控制在1到20毫秒。看上去是個(gè)不錯(cuò)的成績(jī),不過優(yōu)化這條路沒有終點(diǎn),當(dāng)我們的系統(tǒng)有超過幾百人、上千人同時(shí)使用時(shí),仍然會(huì)顯的力不從心
    2013-03-03
  • MySQL字符集亂碼及解決方案分享

    MySQL字符集亂碼及解決方案分享

    這篇文章主要給大家介紹了關(guān)于MySQL字符集亂碼及解決方案的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用MySQL具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • MySQL數(shù)據(jù)文件存儲(chǔ)位置的查看方法

    MySQL數(shù)據(jù)文件存儲(chǔ)位置的查看方法

    這篇文章主要為大家詳細(xì)介紹了MySQL數(shù)據(jù)文件存儲(chǔ)位置的查看方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • MYSQL的存儲(chǔ)過程和函數(shù)簡(jiǎn)單寫法

    MYSQL的存儲(chǔ)過程和函數(shù)簡(jiǎn)單寫法

    簡(jiǎn)單的說,就是一組SQL語句集,功能強(qiáng)大,可以實(shí)現(xiàn)一些比較復(fù)雜的邏輯功能,類似于JAVA語言中的方法,這里就為大家簡(jiǎn)單介紹一下,需要的朋友可以參考下
    2018-05-05
  • MySQL中非常強(qiáng)大而少為認(rèn)知的14個(gè)sql查詢實(shí)用技巧,你知道幾個(gè)?

    MySQL中非常強(qiáng)大而少為認(rèn)知的14個(gè)sql查詢實(shí)用技巧,你知道幾個(gè)?

    本文介紹了MySQL的14個(gè)少為認(rèn)知,卻非常強(qiáng)大的sql查詢實(shí)用技巧,涵蓋分組拼接、字符串處理、時(shí)間函數(shù)、數(shù)據(jù)插入、鎖機(jī)制、表結(jié)構(gòu)查看、備份復(fù)制及性能優(yōu)化等場(chǎng)景,幫助提升數(shù)據(jù)庫操作效率
    2025-10-10

最新評(píng)論

苏尼特左旗| 宝鸡市| 石柱| 石家庄市| 元氏县| 彭州市| 舟山市| 乐陵市| 惠来县| 霍林郭勒市| 威信县| 罗山县| 沅陵县| 莎车县| 搜索| 达州市| 安丘市| 罗城| 巴南区| 寿光市| 黄冈市| 朝阳区| 闵行区| 苏尼特左旗| 漠河县| 安平县| 临漳县| 万荣县| 阿城市| 长乐市| 宝应县| 乌兰县| 齐齐哈尔市| 车险| 永安市| 郴州市| 杭州市| 海南省| 军事| 安庆市| 滁州市|