【夯實Mysql基礎】記一次mysql語句的優化過程

来源:http://www.cnblogs.com/aiweixiao/archive/2016/11/22/6090361.html
-Advertisement-
Play Games

1. 【事件起因】 今天在做項目的時候,發現提供給客戶端的介面時間很慢,達到了2秒多,我第一時間,抓了介面,看了運行的sql,發現就是 2個sql慢,分別占了1秒多。 一個sql是 鏈接了5個表同時使用了 2個 order by和 1個limit的分頁 sql。 一個sql是上一個sql的count ...


 

  1. 【事件起因】


 

  今天在做項目的時候,發現提供給客戶端的介面時間很慢,達到了2秒多,我第一時間,抓了介面,看了運行的sql,發現就是 2個sql慢,分別占了1秒多。

  一個sql是 鏈接了5個表同時使用了 2個 order by和 1個limit的分頁 sql。

      一個sql是上一個sql的count(*),即鏈接了5個表,當然沒有limit了(取總數)。

 

  2. 【著手優化】


 

    1)【優化思路】

        第一條是 做client調用 service層的數據緩存

        第二條就是 優化sql本身。

        這裡著重講一下 優化sql本身

 

    2)【使用expain】

        使用 explain語句,查看該語句,

                  看著沒有啥毛病啊,使用到了索引,掃描的行數也多,一個 85行,一個338多行,其他的也都是 1行。        3)【使用子查詢優化】         使用子查詢進行優化,效果差不多,只能想別的辦法     4)【去掉order by排序】         和同事討論時,覺得原來的5張表該加的索引都加了,為什麼速度慢呢,我說裡面還做了排序處理。         說者無心,聽者有意。他說 你去掉排序試試,果然,去掉排序後,時間降到了 0.002秒,快了很多。         但是order by排序為什麼很慢呢,因為 order by的那個欄位也是 有索引的。       5)【創建聯合索引】         後來查詢了下麵這篇文章(mysql中提高Order by語句查詢效率的兩個思路分析)才知道, 如果查詢出來的數據量很大的時候,order  by欄位,必須和前面的where語句中的欄位建立 聯合索引才行,同事建立的索引順序還得是 先是 where語句中的欄位最後是 order by中的欄位。     6)【最終方案】          明白了道理,但是鑒於還得麻煩 DBA創建索引為 特定項目建立特定的索引也不划算。這部分數據一遍不經常變動,可以做成緩存的形式,就作罷了,但是 分析問題的思路和優化 sql order的過程還是有收穫的     3. 【參考資料】

     1)mysql中提高Order by語句查詢效率的兩個思路分析

     2)【夯實Mysql基礎】mysql中提高Order by語句查詢效率的兩個思路分析

     


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

-Advertisement-
Play Games
更多相關文章
  • 修改欄位預設值-查找欄位的約束名稱 刪除約束 修改預設值約束 獲取表列的預設值 ...
  • 1.打開資料庫:找到表,雙擊要插入的表打開: 2.打開之後點擊文件->查詢表 3.輸入要查詢的語句,點擊運行。成功後會有提示。 ...
  • oracle: 一、數據 db數據欄位如下: task_id task_name t.parent_task_id *** *** *** *** *** 000001 t1 *** *** 000002 t11 000001 *** 000005 t12 000001 *** 000003 t11 ...
  • 這是最基礎的用法: LISTAGG(XXX,XXX) WITHIN GROUP( ORDER BY XXX) 例: select listagg(oeid,',') within GROUP (order by oeid) ...
  • Master/Slave主從複製 主從複製MongoDB中比較常用的一種方式,如果要實現主從複製至少應該有兩個MongoDB實例,一個作為主節點負責客戶端請求,另一個作為從節點負責從主節點映射數據,提供數據備份,客戶端讀取等,推薦一主多從模式 MongoDB主從複製的實現方式: 主節點的操作會被記錄... ...
  • 11g新特性:Health Monitor Checks 一、什麼是Health Monitor Checks Health Monitor Checks能夠發現文件損壞,物理、邏輯塊損壞,undo、redo損壞,數據字典損壞等等。 Health Monitor Checks產生結果報告,它包含瞭解 ...
  • Sqoop的使用應該是Oozie裡面最常用的了,因為很多BI數據分析都是基於業務資料庫來做的,因此需要把mysql或者oracle的數據導入到hdfs中再利用mapreduce或者spark進行ETL,生成報表信息。 因此本篇的Sqoop Action其實就是運行一個sqoop的任務而已。 同樣ac ...
  • 1.SELECT DISTINCT 語句 關鍵詞DISTINCT用於返回唯一不同的值。 語法: SELECT DISTINCT 列名稱 FROM 表名稱 2.SELECT INTO語句 SELECT INTO語句從一個表中選取數據,然後把數據插入另一個表中。 SELECT INTO語句常用於創建表的 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...