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

MySQL進(jìn)行大數(shù)據(jù)量分頁(yè)的優(yōu)化技巧分享

 更新時(shí)間:2024年01月29日 14:23:54   作者:我想問(wèn)問(wèn)天  
mysql大數(shù)據(jù)量分頁(yè)情況下性能會(huì)很差,所以本文就來(lái)講一講mysql大數(shù)據(jù)量下偏移量很大,性能很差的問(wèn)題,并附上解決方式,希望對(duì)大家有所幫助

前言

之前有看過(guò)到mysql大數(shù)據(jù)量分頁(yè)情況下性能會(huì)很差,但是沒(méi)有探究過(guò)它的原因,今天講一講mysql大數(shù)據(jù)量下偏移量很大,性能很差的問(wèn)題,并附上解決方式。

原因

將原因前我們先做一個(gè)試驗(yàn),我做試驗(yàn)使用的是mysql5.7.24版本(mysql8上我也試驗(yàn)出來(lái)同樣的問(wèn)題),看看mysql是不是在偏移量比較大的時(shí)候分頁(yè)會(huì)比較慢,性能比較差

版本

mysql> select version();
+-----------+
| version() |
+-----------+
| 5.7.24    |
+-----------+
1 row in set (0.00 sec)

表結(jié)構(gòu)

CREATE TABLE `trace_monitor_log` (
  `id` varchar(30) NOT NULL COMMENT '表主鍵id',
  `user_id` varchar(30) DEFAULT NULL COMMENT '用戶(hù)id',
  `trace_id` varchar(30) DEFAULT NULL COMMENT '追蹤id',
  `trace_type` varchar(30) DEFAULT NULL COMMENT '追蹤類(lèi)型',
  `path` mediumtext COMMENT '追蹤路徑',
  `source_ip` varchar(255) DEFAULT NULL COMMENT '來(lái)源ip',
  `ext_params` mediumtext COMMENT '請(qǐng)求擴(kuò)展參數(shù)',
  `costs` int(11) DEFAULT '0' COMMENT '請(qǐng)求耗時(shí)(毫秒)',
  `exception` mediumtext COMMENT '異常信息',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時(shí)間',
  PRIMARY KEY (`id`),
  KEY `trace_id` (`trace_id`),
  KEY `trace_type` (`trace_type`),
  KEY `create_time` (`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='監(jiān)控日志表';

試驗(yàn)過(guò)程

這個(gè)是我從測(cè)試環(huán)境找的一張日志表,里面的數(shù)據(jù)量是580萬(wàn)左右,我們先看看只查詢(xún)普通10條數(shù)據(jù)的情況。

數(shù)據(jù)量

mysql> select count(*) from trace_monitor_log;
+----------+
| count(*) |
+----------+
|  5806836 |
+----------+
1 row in set (1.66 sec)
explain select * from trace_monitor_log order by trace_id limit 10;

可以看到?jīng)]有offset偏移量的時(shí)候可以直接走索引,key是trace_id,并且只查詢(xún)了10條數(shù)據(jù)。

我們?cè)趤?lái)看看如果offset是1000的時(shí)候。

explain select * from trace_monitor_log order by trace_id limit 10 offset 1000;

可以看到偏移量比較小的時(shí)候還是可以走索引,rows是1010,這時(shí)候發(fā)現(xiàn)雖然我們只要查詢(xún)10條數(shù)據(jù),但是查詢(xún)的時(shí)候還是會(huì)掃描1000條無(wú)用的索引記錄。

我們接下往下把offset加到100萬(wàn)

explain select * from trace_monitor_log order by trace_id limit 10 offset 1000000;

這個(gè)時(shí)候就會(huì)發(fā)現(xiàn)一個(gè)神奇的現(xiàn)象,竟然沒(méi)有走索引了,type是ALL,就是全表掃描了,執(zhí)行時(shí)間大概花了40多秒,性能確實(shí)很差。這里的原因,本來(lái)根據(jù)索引查出來(lái)100萬(wàn)條記錄,然后把不需要的數(shù)據(jù)給丟棄掉,mysql會(huì)計(jì)算查詢(xún)成本,發(fā)現(xiàn)這樣走索引還沒(méi)有全表掃描快,所以用了全表掃描,但是全表掃描就為了拿到十條數(shù)據(jù)顯然是性能很差的。mysql并不會(huì)自動(dòng)判斷先根據(jù)trace_id的索引找到偏移量需要的10條數(shù)據(jù),再根據(jù)這10條索引找到葉子節(jié)點(diǎn)的主鍵記錄去回表查詢(xún)數(shù)據(jù),導(dǎo)致了這么差的性能。

解決方式

1.延遲關(guān)聯(lián)

先使用覆蓋索引的方式找到對(duì)應(yīng)order by 之后的limit條索引,因?yàn)槭歉采w索引,直接用的索引記錄,沒(méi)有回表所以很快。接著在使用join的方式,將索引記錄和原表關(guān)聯(lián)起來(lái)就可以查出來(lái)對(duì)應(yīng)的limit條數(shù)據(jù)。

explain select * from trace_monitor_log t1 join (select trace_id from trace_monitor_log  order by trace_id limit 1000000,10) t2 on t1.trace_id = t2.trace_id

執(zhí)行時(shí)間平均在500-600毫秒左右,相比全表掃描快了很多。

2.書(shū)簽記錄

這個(gè)概念我也是從網(wǎng)上看到的,還沒(méi)找到具體這個(gè)概念的出處在哪里。不過(guò)不要困于這個(gè)概念,只要理解是先找到對(duì)應(yīng)要查詢(xún)一條索引記錄(書(shū)簽),再根據(jù)這個(gè)索引去范圍查詢(xún)對(duì)應(yīng)的limit條數(shù)數(shù)據(jù)就容易理解了。

explain select * from trace_monitor_log t1 where trace_id > (select trace_id from trace_monitor_log  order by trace_id limit 999999,1)   order by trace_id limit 10

執(zhí)行時(shí)間和延遲關(guān)聯(lián)差不多,也都走了索引,所以性能也比較好。

到此這篇關(guān)于MySQL進(jìn)行大數(shù)據(jù)量分頁(yè)的優(yōu)化技巧分享的文章就介紹到這了,更多相關(guān)MySQL大數(shù)據(jù)量分頁(yè)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL中隱式轉(zhuǎn)換的踩坑記錄以及解決方法分享

    MySQL中隱式轉(zhuǎn)換的踩坑記錄以及解決方法分享

    這篇文章主要和大家分享一個(gè)MySQL隱式轉(zhuǎn)換時(shí)踩過(guò)的坑,差點(diǎn)把服務(wù)器整崩潰了,以及最后的解決辦法。文中的示例代碼講解詳細(xì),感興趣的可以了解一下
    2022-11-11
  • MySQL中的間隙鎖代碼示例講解

    MySQL中的間隙鎖代碼示例講解

    鎖是mysql提供的一種保證不同事務(wù)讀寫(xiě)隔離的重要措施,通過(guò)鎖機(jī)制可以有效提升決多線(xiàn)程下并發(fā)處理事務(wù)能力,不同的鎖劃分對(duì)應(yīng)著不同的使用場(chǎng)景,本文來(lái)深入探討一下mysql的另一種容易被忽視的鎖,即間隙鎖,以及與之相關(guān)的相關(guān)問(wèn)題,需要的朋友可以參考下
    2023-08-08
  • MySQL延遲關(guān)聯(lián)性能優(yōu)化方法

    MySQL延遲關(guān)聯(lián)性能優(yōu)化方法

    這篇文章主要介紹了MySQL延遲關(guān)聯(lián)性能優(yōu)化方法,本文講解了延遲關(guān)聯(lián)的背景、延遲關(guān)聯(lián)的分析、延遲關(guān)聯(lián)的解決等內(nèi)容,需要的朋友可以參考下
    2015-05-05
  • MySQL中的?DQL?聚合函數(shù)詳解

    MySQL中的?DQL?聚合函數(shù)詳解

    SQL聚合函數(shù)是一組函數(shù),用于計(jì)算并返回?cái)?shù)據(jù)集的單個(gè)值,這些函數(shù)通常用于在SELECT語(yǔ)句中匯總數(shù)據(jù),本文給大家介紹MySQL中的DQL聚合函數(shù),感興趣的朋友跟隨小編一起看看吧
    2023-07-07
  • mySQL服務(wù)器連接,斷開(kāi)及cmd使用操作

    mySQL服務(wù)器連接,斷開(kāi)及cmd使用操作

    這篇文章主要介紹了mySQL服務(wù)器連接,斷開(kāi)及cmd使用操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-07-07
  • MySQL OOM 系列三 擺脫MySQL被Kill的厄運(yùn)

    MySQL OOM 系列三 擺脫MySQL被Kill的厄運(yùn)

    這篇文章主要介紹了MySQL OOM 系列三 擺脫MySQL被Kill的厄運(yùn) ,需要的朋友可以參考下
    2016-07-07
  • MySQL臨時(shí)表的使用方法舉例詳解

    MySQL臨時(shí)表的使用方法舉例詳解

    MySQL臨時(shí)表在我們需要保存一些臨時(shí)數(shù)據(jù)時(shí)是非常有用的,這篇文章主要介紹了MySQL臨時(shí)表的使用方法,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-06-06
  • CentOS系統(tǒng)中安裝MySQL和開(kāi)啟MySQL遠(yuǎn)程訪(fǎng)問(wèn)的方法

    CentOS系統(tǒng)中安裝MySQL和開(kāi)啟MySQL遠(yuǎn)程訪(fǎng)問(wèn)的方法

    這篇文章主要介紹了CentOS系統(tǒng)中安裝MySQL和開(kāi)啟MySQL遠(yuǎn)程訪(fǎng)問(wèn)的方法,包括MySQL的隨機(jī)啟動(dòng)等操作的介紹,需要的朋友可以參考下
    2016-02-02
  • 關(guān)于mysql 8.0.13zip包安裝方法

    關(guān)于mysql 8.0.13zip包安裝方法

    這篇文章主要介紹了關(guān)于mysql 8.0.13zip包安裝方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下
    2018-11-11
  • MySQL5.5.21安裝配置教程(win7)

    MySQL5.5.21安裝配置教程(win7)

    這篇文章主要以圖文結(jié)合的方式介紹了Win7系統(tǒng)下安裝MySQL5.5.21的具體過(guò)程,感興趣的小伙伴們可以參考一下
    2016-06-06

最新評(píng)論

苏尼特左旗| 扎赉特旗| 松桃| 女性| 海晏县| 阿瓦提县| 中超| 岚皋县| 蒙山县| 滨州市| 新沂市| 镇巴县| 许昌县| 康保县| 兴国县| 盐津县| 葫芦岛市| 额敏县| 桦甸市| 淮安市| 夏津县| 攀枝花市| 镇江市| 浮梁县| 巫溪县| 镇远县| 赞皇县| 夏邑县| 厦门市| 安化县| 松阳县| 铁岭县| 当涂县| 宣城市| 渑池县| 宽城| 怀远县| 北流市| 左权县| 和龙市| 唐海县|