SQL分頁過多時, 如何優化

来源:https://www.cnblogs.com/woods1815/archive/2019/03/15/10538180.html
-Advertisement-
Play Games

問題: 我們經常會使用到分頁操作,這裡有個問題,在偏移量非常大的時候,它會導致MySQL掃描大量不需要的行然後再拋棄掉。如: 上述這條SQL語句需要查詢10020條記錄然後只返回最後20條。前面的10000條記錄都將被拋棄,這樣代價非常高。 方法一、延遲關聯 優化此類分類查詢的一個最簡單的辦法就是盡 ...


問題:

我們經常會使用到分頁操作,這裡有個問題,在偏移量非常大的時候,它會導致MySQL掃描大量不需要的行然後再拋棄掉。如:

SELECT id, name FROM A ORDER BY id DESC LIMIT 10000, 20;

上述這條SQL語句需要查詢10020條記錄然後只返回最後20條。前面的10000條記錄都將被拋棄,這樣代價非常高。

 

方法一、延遲關聯

優化此類分類查詢的一個最簡單的辦法就是儘可能地使用索引覆蓋掃描如果一個索引包含(或者說覆蓋)所有需要查詢的欄位的值,我們就稱之為“覆蓋索引”。可以使用explain查看extra列信息,如果看到“Using index”的信息則說明使用到了覆蓋索引。),而不是查詢所有的列。然後根據需要做一次關聯操作再返回所需的列。對於偏移量很大的時候,這樣做的效率會提升非常大。

如上述SQL語句可以修改為:

SELECT id, name 
     FROM A 
         INNER JOIN (
            SELECT id FROM A 
            ORDER BY id DESC LIMIT 10000, 20
         ) AS tmp USING(id);

這裡的“延遲關聯”將大大提升查詢效率,它讓MySQL掃描儘可能少的頁面,獲取需要訪問的記錄後再根據關聯列回原表查詢需要的所有列。

 

方法二、使用書簽記錄上次取數據的位置

可以使用書簽記錄上次取數據的位置,那麼下次就可以直接從該書簽記錄的位置開始掃描,這樣就可以避免使用OFFSET。

如上一次記錄到10000為止,則可以修改為:

SELECT id, name FROM A WHERE id < 10000 ORDER BY id DESC LIMIT 20;

這種方法的好處是無論翻頁到多麼後面,其性能都會很好。

 

方法三:使用between and

有時候也可以將LIMIT查詢轉換為已知位置的查詢,讓MySQL通過範圍掃描獲得到對應的結果。

如知道邊界值為10000,10020後上述語句可以修改為:

SELECT id , name FROM A WHERE id BETWEEN 10000 AND 10020 ORDER BY id DESC;

 

 

除上述方法外,還有一些其它方法,如:

  • 使用預先計算的彙總表
  • 關聯到一個冗餘表,冗餘表只包含主鍵列和需要做排序的數據列
  • 使用Sphinx優化一些搜索操作

 


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

-Advertisement-
Play Games
更多相關文章
  • 新申請的阿裡雲ECS,用xshell連接時修改密碼: 實例密碼就是xshell連接密碼 遠程連接密碼為登錄阿裡雲後臺的密碼 ...
  • 轉自:https://blog.csdn.net/techviewer/article/details/26485017 unattend.txt文件: 主要註釋: dcpromo.exe /unattend:C:\Users\Administrator\Desktop\123.txt,這個是應答文 ...
  • 安裝準備: 1、安裝前需要先關閉selinux和firewall. 關閉Linux: [root@zabbix ~]# vi /etc/selinux/config 將SELINUX=enforcing改為SELINUX=disabled 設置後需要重啟才能生效 配置zabbix的yum源: rpm ...
  • 自己用錯了命令,直接將加入域的電腦使用dsrm刪除了,本來應該使用netdom remove的,結果在域控制器上使用netdom remove錯誤,在客戶端上登錄時一樣提示:netdom remove 解決辦法 先退域,再加域。 1.管理員登錄客戶端 設置工作組可隨意輸入一個工作組名稱,實現退域 ...
  • 這幾天在看Linux內核的IPC命名空間時候看到關於IDR的一些管理性質的東西,剛開始看有些迷茫,深入看下去豁然開朗的感覺,把一些心得輸出共勉。 我們來看一下什麼是IDR?IDR的作用是什麼呢? 先來看下IDR的作用:IDR主要實現ID與數據結構的綁定。剛開始看的時候感覺到有點懵,什麼叫“ID與數據 ...
  • 剛開始接觸postgresql,安裝後就有一個預設用戶postgres,而且在啟動postgresql後只能通過切換到linux的postgres用戶才能登錄資料庫進行操作,和Mysql的登錄認證居然不一樣。查了好多資料才知道,原來有個pg_hba.conf的配置文件作登錄限制。它的語法規則是這樣的 ...
  • MySQL主從複製 主伺服器 配置文件目錄 mkdir /var/lib/mysql/master/conf.d 數據存儲目錄 mkdir var/lib/mysql/master/data 配置my.cnf文件 [mysqld] pid file = /var/run/mysqld/mysqld. ...
  • 希望各位前輩、大佬能給與一些指點,萬分感謝!!!!!! 我是剛入職大數據工作的小白,對大數據的相關知識只能算是有了一個簡單的瞭解,也找了一份大數據的工作(目前還未入職)。 我的困惑是我的大數據之路該往哪個方向走?????在接下來的路上還需要學習那些東西???? 希望各位前輩、大佬能給與一些指點,萬分 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...