MySQL 常用優化方式

MySQL 常用優化方式

    • sql 書寫順序與執行順序
    • SQL設計優化
      • 使用索引
      • 避免索引失效
      • 分析慢查詢
      • 合理使用子查詢和臨時表
      • 列相關使用
    • 日常SQL優化場景
      • limit語句
      • 隱式類型轉換
      • 嵌套子查詢
      • 混合排序
      • 查詢重寫

sql 書寫順序與執行順序

在這里插入圖片描述

(7) SELECT
(8) DISTINCT <select_list>
(1) FROM  <main_table>
(3) <join_type> JOIN <join_table>
(2) ON <join_condition>
(4) WHERE <where_condition>
(5) GROUP BY <group_by_list>
(6) HAVING <having_condition>
(9) ORDER BY <order_by_condition>
(10) LIMIT <limit_number>

SQL設計優化

使用索引

  • 確保對經常作為查詢條件的列創建索引
  • 對JOIN的列創建索引
  • 但要注意不要過度索引,因為這會減慢寫操作(如INSERT、UPDATE、DELETE)

避免索引失效

  • 匹配前綴:如果在WHERE子句中使用LIKE操作符,且匹配模式的開始部分是通配符(例如LIKE ‘%xyz’),將不會使用索引。但如果是’xyz%',則使用索引。
  • 使用函數或表達式:在列上使用函數或表達式(例如WHERE YEAR(column) = 2021)會導致索引失效,因為MySQL無法利用索引直接定位數據
  • OR條件:or表達式兩邊都必須有索引才會走索引,否則將不會走索引。
    在這里插入圖片描述
  • 反向條件不走索引 != 、 <> 、 NOT IN、IS NOT NULL
  • 數據類型不一致,隱式轉換(可能)導致索引失效【這點在隱式類型轉換中有場景演示】
    在這里插入圖片描述

分析慢查詢

  • 使用EXPLAIN關鍵字可以幫助你分析SQL查詢的執行計劃。通過分析,你可以發現潛在的性能瓶頸,如全表掃描、沒有使用索引等問題。

合理使用子查詢和臨時表

  • 子查詢和臨時表如果不當使用,會造成性能問題。在可能的情況下,嘗試使用JOIN來替代它們。

列相關使用

  • 使用最適合數據的最小數據類型,如INT、VARCHAR等,這可以減少磁盤IO,提高查詢效率。

  • 盡量避免使用SELECT *,而是明確指定需要查詢的字段。這不僅可以減少數據傳輸量,還能提高查詢效率。

日常SQL優化場景

limit語句

SELECT *
FROM   operation
WHERE  type = 'SQLStats'AND name = 'SlowLog'
ORDER  BY create_time
LIMIT  1000, 10;

在優化上面SQL時,如果數據量特別龐大,除了在type, name, create_time 字段上加組合索引,還可以記錄上一次返回列表最后一條數據,以它為開始,優化后(并不會根據數據量的增長而發生變化):

SELECT   *
FROM     operation
WHERE    type = 'SQLStats'
AND      name = 'SlowLog'
AND      create_time > '2017-03-16 14:00:00'
ORDER BY create_time limit 10;

隱式類型轉換

隱式轉換,就是不帶轉換類型的轉換,當一個字段類型為varchar,但是在判斷時SQL是用int去判斷,MySQL 就會對這個int進行隱式轉換,將其int類型轉換為varchar

-- salecode 為varchar類型  
explain select * from my_distribute where salecode=898

在這里插入圖片描述
在上述例子中,salecode為varchar類型,其列有索引,但是SQL并沒有使用索引,是因為SQL中發生了隱式轉換,導致了全表掃描,那是不是所有隱式轉換都會使索引失效?

-- address 為int類型  
explain select * from my_distribute where address='22'

在這里插入圖片描述
還是同一個表,address類型為int,其列有索引,但是SQL卻使用索引[address],以上可知,隱式轉換不一定會導致索引失效,而是根據索引的類型變化,如果是數值類型,則右邊無論是數值還是字符串都可以走索引,但是我們在開發中,一定要格外注意,避免隱式轉換索引失效

嵌套子查詢

UPDATE operation o
SET    status = 'applying'
WHERE  o.id IN (SELECT idFROM   (SELECT o.id,o.statusFROM   operation oWHERE  o.group = 123AND o.status NOT IN ( 'done' )ORDER  BY o.parent,o.idLIMIT  1) t);

在這里插入圖片描述
上述例子中,更新operation使用了子查詢去做過濾,并且使用了in條件,子查詢將會在檢索operation每一條數據時,都會執行一遍子查詢,并將結果集返回判斷operation的o.id是否在結果集中,效率非常低下,我們在開發中,也盡量使用join去替代子查詢,改良后的sql:

UPDATE operation oJOIN  (SELECT o.id,o.statusFROM   operation oWHERE  o.group = 123AND o.status NOT IN ( 'done' )ORDER  BY o.parent,o.idLIMIT  1) tON o.id = t.id
SET    status = 'applying'

在這里插入圖片描述

混合排序

MySQL 不能利用索引進行混合排序。但在某些場景,還是有機會使用特殊方法提升性能的。

SELECT *
FROM   my_order o
INNER JOIN my_appraise a ON a.orderid = o.id
ORDER  BY a.is_reply ASC,a.appraise_time DESC
LIMIT  0, 20

在這里插入圖片描述
由于 is_reply 只有0和1兩種狀態,可以按照下面的方法重寫:

SELECT *
FROM   ((SELECT *FROM   my_order oINNER JOIN my_appraise aON a.orderid = o.idAND is_reply = 0ORDER  BY appraise_time DESCLIMIT  0, 20)UNION ALL(SELECT *FROM   my_order oINNER JOIN my_appraise aON a.orderid = o.idAND is_reply = 1ORDER  BY appraise_time DESCLIMIT  0, 20)) t
ORDER  BY  is_reply ASC,appraisetime DESC
LIMIT  20;

使用表子查詢,將兩個查詢結果集UNION ALL 合并結果實現排序

查詢重寫

 SELECTa.*,c.allocated 
FROM(SELECT resourceid FROM my_distribute d WHERE isdelete = 0 AND cusmanagercode = '22353' ORDER BY salecode LIMIT 20 ) aLEFT JOIN ( SELECT resourcesid, sum( ifnull( allocated, 0 )* 12345 ) allocated FROM my_resources GROUP BY resourcesid ) c ON a.resourceid = c.resourcesid

在這里插入圖片描述
以上SQL中因為c表使用了全表聚合,導致了數據全表掃描10w數據,優化后:

SELECTr.resourcesid,sum( ifnull( allocated, 0 ) * 12345 ) allocated 
FROMmy_resources r,( SELECT resourceid, cusmanagercode FROM my_distribute d WHERE isdelete = 0 AND cusmanagercode = '22353' ORDER BY salecode LIMIT 20 ) a 
WHEREr.resourcesid = a.resourceid 
GROUP BYresourceid					

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/715700.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/715700.shtml
英文地址,請注明出處:http://en.pswp.cn/news/715700.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ctf_show筆記篇(web入門---php特性)

目錄 php特性 89&#xff1a;直接數組繞過preg_match當遇到數組時會直接報錯輸出0 90&#xff1a;這里利用了intval的特性 91&#xff1a;這里需要細節一點 92-93&#xff1a;這兩題的方法很多可以發散思維 94&#xff1a;還是利用小數繞過例如4476.0 95&#xff1a;這里…

HTML和CSS (前端共三篇)【詳解】

目錄 一、前端開發介紹 二、HTML入門 三、HTML基礎標簽 四、CSS樣式修飾 五、HTML表格標簽 六、HTML表單標簽 一、前端開發介紹 web應用有BS和CS架構兩種&#xff0c;其中我們主要涉及的是BS架構。而BS架構里&#xff0c;B&#xff08;Browser瀏覽器&#xff09;是客戶端的…

藍橋杯(3.1)

92. 遞歸實現指數型枚舉 import java.util.Scanner;public class Main {static int N 16;static int n;static int[] st new int[N]; public static void dfs(int u) {if(u > n) {for(int i1;i<n;i) {if(st[i] 1)System.out.print(i" ");}System.out.print…

798. 差分矩陣

Problem: 798. 差分矩陣 文章目錄 思路解題方法復雜度Code 思路 這是一個差分矩陣的問題。差分矩陣是一種用于處理區間修改問題的數據結構&#xff0c;它可以在O(1)的時間復雜度內完成區間的修改操作&#xff0c;然后在O(n)的時間復雜度內完成所有元素的更新操作。 在這個問題中…

【k8s管理--兩種方式安裝prometheus】

1、k8s的監控方案 1.1 Heapster Heapster是容器集群監控和性能分忻工具&#xff0c;天然的支持Kubernetes和CoreOS。 Kubernetes有個出名的監控agent–cAdvisor。在每個kubernetes Node上都會運行cAdvisor&#xff0c;它會收集本機以及容器的監控數(cpu,memory,filesystem,ne…

conda目錄遷移

conda默認安裝在系統目錄&#xff0c; 但隨著使用&#xff0c; 占用的空間越來越大&#xff0c; 需要遷移到其他目錄。 假設原來conda安裝在/home/leo/anaconda3目錄&#xff0c; 現在要遷移到/data路徑。 方法是&#xff1a; 1 移動文件位置 mv /home/leo/anaconda3 /dat…

python筆記_鍵盤輸入

例&#xff1a;從控制臺接收員工信息 name input("輸入姓名:") age input("輸入年齡:") id input("輸入id:") print("name",name) print("age",age) print("id",id) ——> 輸入姓名: 1&#xff0c;接收到的…

Ubuntu將c++編譯成.so文件并測試

一、準備cpp和h文件 創建test.cpp 在cpp中定義相加的函數funcAdd&#xff0c;給出函數的細節代碼 #include <iostream> using namespace std;int funcAdd(int x, int y) {return xy; }創建test.h 在h中聲明定義的函數&#xff0c;不需要任何細節 #ifndef __TEST__ #…

LeetCode 熱題 HOT 100(P1~P10)

&#x1f525; LeetCode 熱題 HOT 100 這里記錄下刷題過程中的心得&#xff0c;其實算法題基本就是個套路問題&#xff0c;很多時候你不知道套路或者模板&#xff0c;第一次嘗試去做的時候就會非常懵逼、沮喪和無助。而且就算你一時理解并掌握了&#xff0c;過一段時間往往會絕…

蘋果 Vision Pro零售部件成本價格分析

蘋果公司發布的全新頭戴式顯示器 Apple Vision Pro 雖然售價高達3499美元&#xff0c;但其制造成本同樣不菲&#xff0c;根據研究機構 Omdia 的估計&#xff0c;該頭顯僅零部件成本就超過了1500美元。這款頭顯的總零部件成本估計為1542美元&#xff0c;這還并不包括研發、包裝、…

騰訊云服務器CVM_云主機_云計算服務器_彈性云服務器

騰訊云服務器CVM提供安全可靠的彈性計算服務&#xff0c;騰訊云明星級云服務器&#xff0c;彈性計算實時擴展或縮減計算資源&#xff0c;支持包年包月、按量計費和競價實例計費模式&#xff0c;CVM提供多種CPU、內存、硬盤和帶寬可以靈活調整的實例規格&#xff0c;提供9個9的數…

【算法】順時針打印矩陣(圖文詳解,代碼詳細注釋

目錄 題目 代碼如下: 題目 輸入一個矩陣,按照從外向里以順時針的順序依次打印出每一個數字。例如:如果輸入如下矩陣: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 則打印出數字:1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10 這一道題乍一看,沒有包含任何復雜的數據結構和…

Doris實戰——美聯物業數倉

目錄 一、背景 1.1 企業背景 1.2 面臨的問題 二、早期架構 三、新數倉架構 3.1 技術選型 3.2 運行架構 3.2.1 數據模型 縱向分域 橫向分層 數據同步策略 3.2.2 數據同步策略 增量策略 全量策略 四、應用實踐 4.1 業務模型 4.2 具體應用 五、實踐經驗 5.1 數據…

代碼隨想錄算法訓練營|day45

第九章 動態規劃 322.零錢兌換279.完全平方數代碼隨想錄文章詳解總結 322.零錢兌換 dp[i]表示湊成i所需的最少零錢個數 (1)先遍歷物品&#xff0c;后遍歷背包 func coinChange(coins []int, amount int) int {maxAmount : amount 1dp : make([]int, amount1)for i : 0; i &l…

下載github項目到pycharm

一、下載git 1.下載git鏈接 https://git-scm.com/ 2.一路點擊next&#xff0c;最后finish 二、使用git 1.安裝成功后在開始菜單欄會找到如下內容&#xff0c;其中常用的是Git Bash 2.點擊Git Bash 3.這里就可以克隆github上的代碼了 點擊復制&#xff0c;在命令行輸入…

C#判斷DataTable1 A列的集合是否為DataTable2 B列的集合的子集

DataSet ds2 (DataSet)res2.Anything; // 檢查 集合B是否為集合A的子集 var table1MaterialCodes ds.Tables[2].AsEnumerable().Select(row > row["Code"]).ToList(); //DataSet1 表Code列集合A var table2MaterialCodes ds2.Tables[0].AsEnumerable().Selec…

2024免費mac蘋果電腦的清理和維護軟件CleanMyMac X

對于 Mac 用戶來說&#xff0c;電腦的清理和維護是一件讓人頭疼的事情。但是&#xff0c;有了 CleanMyMac X&#xff0c;這一切都將變得輕松愉快。CleanMyMac X 是一款專為 Mac 設計的電腦清理軟件&#xff0c;它以其強大的功能和簡單的操作&#xff0c;讓無數用戶為之傾倒。 C…

艾爾登法環備份存檔方法

1.PC端使用WinR輸入%AppData%\EldenRing 2.如圖創建文件夾“我這取名叫備份存檔”&#xff0c;將其中的三個文件復制到新建的文件夾中 3.理論上只需要備份替換ER0000.sl2文件即可

【雙指針】合并兩個有序數組O(N)

合并兩個有序數組 鏈接 . - 力扣&#xff08;LeetCode&#xff09;. - 備戰技術面試&#xff1f;力扣提供海量技術面試資源&#xff0c;幫助你高效提升編程技能,輕松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/merge-sorted-array/ 題目 題解 采用雙指針…

青少年CTF擂臺挑戰賽 2024 #Round 1 Web方向題解 WP 全

EasyMD5 題目描述&#xff1a;php沒有難題 考點總結&#xff1a;腦洞題目&#xff0c;不如我出&#xff08;狗頭 只允許兩個都上傳pdf文件。 文件還不能太大了。burp多次發包發現要求兩個pdf內容不一樣 不一樣時候&#xff0c;提示我們MD5碰撞。 科學計數法繞過 PHP的后門 …