MySQL百萬數據深度分頁優化思路分析

来源:https://www.cnblogs.com/bingfengdada/archive/2023/05/09/17384958.html
-Advertisement-
Play Games

業務場景 一般在項目開發中會有很多的統計數據需要進行上報分析,一般在分析過後會在後臺展示出來給運營和產品進行分頁查看,最常見的一種就是根據日期進行篩選。這種統計數據隨著時間的推移數據量會慢慢的變大,達到百萬、千萬條數據只是時間問題。 瓶頸再現 創建了一張user表,給create_time欄位添加了 ...


業務場景

一般在項目開發中會有很多的統計數據需要進行上報分析,一般在分析過後會在後臺展示出來給運營和產品進行分頁查看最常見的一種就是根據日期進行篩選。這種統計數據隨著時間的推移數據量會慢慢的變大,達到百萬、千萬條數據只是時間問題。

瓶頸再現

創建了一張user表,給create_time欄位添加了索引。併在該表中添加了100w條數據。

我們這裡使用limit分頁的方式查詢下前5條數據和後5條數據在查詢時間上有什麼區別。

查詢前10條基本上不消耗什麼時間

我們從第50w+開始取數據的時候,查詢耗時1秒。

SQL_NO_CACHE

這個關鍵詞是為了不讓SQL查詢走緩存。

同樣的SQL語句,不同的分頁條件,兩者的性能差距如此之大,那麼隨著數據量的增長,往後頁的查詢所耗時間按理會越來越大。

問題分析

回表

我們一般對於查詢頻率比較高的欄位會建立索引。索引會提高我們的查詢效率。我們上面的語句使用了SELECT * FROM user,但是我們並不是所有的欄位都建立了索引。當從索引文件中查詢到符合條件的數據後,還需要從數據文件中查詢到沒有建立索引的欄位。那麼這個過程稱之為回表

覆蓋索引

如果查詢的欄位正好創建了索引了,比如 SELECT create_time FROM user,我們查詢的欄位是我們創建的索引,那麼這個時候就不需要再去數據文件裡面查詢,也就不需要回表。這種情況我們稱之為覆蓋索引

IO

回表操作通常是IO操作,因為需要根據索引查找到數據行後,再根據數據行的主鍵或唯一索引去聚簇索引中查找具體的數據行。聚簇索引一般是存儲在磁碟上的數據文件,因此在執行回表操作時需要從磁碟讀取數據,而磁碟IO是相對較慢的操作。

LIMTI 2000,10 ?

你有木有想過LIMIT 2000,10會不會掃描1-2000行,你之前有沒有跟我一樣,覺得數據是直接從2000行開始取的,前面的根本沒掃描或者不回表。其實這樣的寫法,一個完整的流程是查詢數據,如果不能覆蓋索引,那麼也是要回表查詢數據的。

現在你知道為什麼越到後面查詢越慢了吧!

問題總結

我們現在知道了LIMIT 遇到後面查詢的性能越差,性能差的原因是因為要回表,既然已經找到了問題那麼我們只需要減少回表的次數就可以提升查詢性能了。

解決方案

既然覆蓋索引可以防止數據回表,那麼我們可以先查出來主鍵id(主鍵索引),然後將查出來的數據作為臨時表然後 JOIN 原表就可以了,這樣只需要對查詢出來的5條結果進行數據回表,大幅減少了IO操作。

優化前後性能對比

我們看下執行效果:

  • 優化前:1.4s

  • 優化後:0.2s

查詢耗時性能大幅提升。這樣如果分頁數據很大的話,也不會像普通的limit查詢那樣慢。

本文來自博客園,作者:一個程式員的成長,轉載請註明原文鏈接:https://www.cnblogs.com/bingfengdada/p/17384958.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一:背景 1. 講故事 這個案例有點特殊,以前dump分析都是和軟體工程師打交道,這次和非業內人士交流,隔行如隔山,從指導dump怎麼抓到問題解決,需要一個強大的耐心。 前幾天有位朋友在微信上找到我,說他們公司採購的MES系統登錄的時候出現了異常,讓我幫忙看一下,我在想解鈴還須系鈴人,怎麼的也不應該 ...
  • 本文屬於OData系列 Intro 對外提供WEBAPI時,如果遇上了版本升級,那麼控制WEBAPI的版本也是非常必要的。OData官方提供了版本控制以及管理的解決方案,我個人是實踐體會是不好用,好在社區提供了對應的nuget包,與.NET主版本同步更新。 介紹 ASP.NET API Versio ...
  • #!/usr/bin/env bash # 常量初始化 set_runtime_vars(){ # 日期時間 Now_Date=`date +"%Y-%m-%d %H:%M:%S"` # 服務狀態 Service_Status=( "服務已開啟" "服務已停止" ) # 動作狀態 Action_St ...
  • 問題:客戶反饋伺服器ssh連接不上 設備信息:Asianux Server release 7.3.1512(Lotus) 定位:通過虛擬機控制台重啟伺服器,發現能登錄虛擬機,查看伺服器各種狀態都正常。 客戶使用一段時間後又卡死,ssh連接不上,登錄發現進程數有一萬多個,導致記憶體不足,伺服器卡斷 查 ...
  • 1、筆記本擴展顯示器,微信界面顯示字體模糊如何解決? 解決方案: 第一步:滑鼠右鍵打開微信快捷方式,選擇‘屬性’,找到‘相容性’,選擇‘ 更改高DPI設置’ 第二步:高DPI縮放替代:勾選✔ ‘替代高DPI縮放行為’ 第三步:點擊“確定”。 第四步:重新啟動微信,微信界面的字體顯示清晰了 2、問題描 ...
  • #實驗六 存儲過程 第1關:增加供應商相關列sqty use demo; #代碼開始 #在S表中增加一列供應零件總數量(sqty),預設值為0。 altertable s add sqty intdefault0; #代碼結束 desc s; 第2關:定義、調用簡單存儲過程 use demo; #代 ...
  • #實驗七 函數與觸發器 第1關:定義、調用參數函數 相關知識 MySQL存儲函數 存儲函數和存儲過程一樣,都是在資料庫中定義一些 SQL 語句的集合。存儲函數可以通過 return 語句返回函數值,主要用於計算並返回一個值。而存儲過程沒有直接返回值,主要用於執行操作。 在 MySQL 中,使用 CR ...
  • 摘要:本文分析了分散式資料庫發展情況、分散式資料庫應用的主要問題,從行業應用的角度給出了分散式資料庫發展的建議。 本文分享自華為雲社區《數字化轉型下我國分散式資料庫應用挑戰及發展建議》,作者:資料庫領域科學家、華為雲資料庫GaussDB首席專家 馮柯。 當前,金融等重點行業都在進行數字化轉型,而分佈 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...