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

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

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

前言

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

原因

將原因前我們先做一個(gè)試驗(yàn),我做試驗(yàn)使用的是mysql5.7.24版本(mysql8上我也試驗(yàn)出來同樣的問題),看看mysql是不是在偏移量比較大的時(shí)候分頁會(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 '用戶id',
  `trace_id` varchar(30) DEFAULT NULL COMMENT '追蹤id',
  `trace_type` varchar(30) DEFAULT NULL COMMENT '追蹤類型',
  `path` mediumtext COMMENT '追蹤路徑',
  `source_ip` varchar(255) DEFAULT NULL COMMENT '來源ip',
  `ext_params` mediumtext COMMENT '請求擴(kuò)展參數(shù)',
  `costs` int(11) DEFAULT '0' COMMENT '請求耗時(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)過程

這個(gè)是我從測試環(huán)境找的一張日志表,里面的數(shù)據(jù)量是580萬左右,我們先看看只查詢普通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,并且只查詢了10條數(shù)據(jù)。

我們在來看看如果offset是1000的時(shí)候。

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

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

我們接下往下把offset加到100萬

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

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

解決方式

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

先使用覆蓋索引的方式找到對應(yīng)order by 之后的limit條索引,因?yàn)槭歉采w索引,直接用的索引記錄,沒有回表所以很快。接著在使用join的方式,將索引記錄和原表關(guān)聯(lián)起來就可以查出來對應(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.書簽記錄

這個(gè)概念我也是從網(wǎng)上看到的,還沒找到具體這個(gè)概念的出處在哪里。不過不要困于這個(gè)概念,只要理解是先找到對應(yīng)要查詢一條索引記錄(書簽),再根據(jù)這個(gè)索引去范圍查詢對應(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ōu)化技巧分享的文章就介紹到這了,更多相關(guān)MySQL大數(shù)據(jù)量分頁內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

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

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

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

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

    鎖是mysql提供的一種保證不同事務(wù)讀寫隔離的重要措施,通過鎖機(jī)制可以有效提升決多線程下并發(fā)處理事務(wù)能力,不同的鎖劃分對應(yīng)著不同的使用場景,本文來深入探討一下mysql的另一種容易被忽視的鎖,即間隙鎖,以及與之相關(guān)的相關(guā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語句中匯總數(shù)據(jù),本文給大家介紹MySQL中的DQL聚合函數(shù),感興趣的朋友跟隨小編一起看看吧
    2023-07-07
  • mySQL服務(wù)器連接,斷開及cmd使用操作

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

    這篇文章主要介紹了mySQL服務(wù)器連接,斷開及cmd使用操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    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í)表的使用方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-06-06
  • CentOS系統(tǒng)中安裝MySQL和開啟MySQL遠(yuǎn)程訪問的方法

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

    這篇文章主要介紹了CentOS系統(tǒng)中安裝MySQL和開啟MySQL遠(yuǎ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的具體過程,感興趣的小伙伴們可以參考一下
    2016-06-06

最新評(píng)論

延川县| 盐源县| 华蓥市| 宁安市| 屯门区| 泽库县| 青龙| 星座| 通州市| 六安市| 肥东县| 金坛市| 县级市| 方城县| 华安县| 昭苏县| 威宁| 英吉沙县| 石林| 乐平市| 南皮县| 陇南市| 南岸区| 南京市| 曲靖市| 龙海市| 沧源| 北海市| 恩施市| 大连市| 扶沟县| 湾仔区| 芜湖县| 龙陵县| 望都县| 通江县| 东光县| 江西省| 文昌市| 泸溪县| 盈江县|