SQL性能優化

show [session|global] status : 查看服務器狀態

show global status like 'Com_' : 查看各種語句的執行次數

開啟慢查詢: 在 MySQL 配置文件(/etc/my.cnf)配置:

#開啟MySQL慢日志查詢開關 
slow_query_log=1 
#設置慢日志的時間為2秒,SQL語句執行時間超過2秒,就會視為慢查詢,記錄慢查詢日志 
long_query_time=2

查看 SQL 的執行耗時:

#查看每一條SQL的耗時基本情況 
show profiles; #查看指定query_id的SQL語句各個階段的耗時情況 
show profile for query query_id; #查看指定query_id的SQL語句CPU的使用情況 
show profile cpu for query query_id;
EXPLAIN 語句

EXPLAIN: 獲取如何執行 SELECT 語句的信息

#直接在select語句之前加上關鍵字 
explain / desc EXPLAIN SELECT 字段列表 FROM 表名 WHERE 條件 ;

EXPLAIN 執行計劃各字段含義:

  • Id:查詢的序列號,表示查詢中執行 select 子句或者操作表的順序 ( id 相同,執行順序從上到下;id 不同,值越大,越先執行)

  • select_type:表示 SELECT 的類型,常見的取值有 SIMPLE(簡單表,即不使用表連接或者子查詢)、PRIMARY(主查詢,即外層的查詢)、UNIONUNION 中的第二個或者后面的查詢語句)、SUBQUERYSELECT/WHERE 之后包含了子查詢)等

  • type:表示連接類型,性能由好到差的連接類型為 NULL、system、const、eq_ref、ref、range、index、all

  • possible_key:顯示可能應用在這張表上的索引,一個或多個

  • Key:實際使用的索引,如果為 NULL 則沒有使用索引

  • Key_len:表示索引中使用的字節數,該值為索引字段最大可能長度,并非實際使用長度,在不損失精確性的前提下,長度越短越好

  • rows:MySQL 認為必須要執行查詢的行數,在 innodb 引擎的表中,是一個估計值,可能并不總是準確的

  • filtered:表示返回結果的行數占需讀取行數的百分比,filtered 的值越大越好

索引使用規則

最左前綴法制:
指的是查詢從索引的最左列開始,不跳過索引中的列,如果跳躍某一列,后面的字段索引會失效

和查詢時放的列順序無關,存在即可,比如:

WHERE b = 2 AND a = 1用到 a, b數據庫會優化條件順序(a 在前),不影響

![[Pasted image 20250719180708.png]]

盡量使用 >= 而不是 >, 這樣索引就不會失效

插入數據優化
  • 插入數據時選擇批量插入:
Insert into tb_test values(1,'Tom'),(2,'Cat'),(3,'Jerry');

數據量大時可以選擇 load 指令:

#客戶端連接服務端時,加上參數 --local-infile
mysql --local-infile -u root -p#設置全局參數local_infile為1,開啟從本地加載文件導入數據的開關
set global local_infile = 1;#執行load指令將準備好的數據,加載到表結構中
load data local infile '/root/sql1.log' into table `tb_user` fields terminated by ',' lines terminated by '\n';
  • 手動提交事務:
start transaction;
insert into tb_test values(1,'Tom'),(2,'Cat'),(3,'Jerry');
insert into tb_test values(4,'Tom'),(5,'Cat'),(6,'Jerry');
insert into tb_test values(7,'Tom'),(8,'Cat'),(9,'Jerry');
commit;

主鍵設計原則:

  • 滿足業務的情況下盡量降低 主鍵長度
  • 插入數據時,盡量選擇順序插入,不要亂序, 性能更好, 選擇使用 AUTO_INCREMENT 自增主鍵
  • 盡量不要使用 UUID 做主鍵或者是其他自然主鍵,如身份證號
  • 業務操作時,不要對主鍵修改
order by 優化
  • Using filesort:通過表的索引或全表掃描,讀取滿足條件的數據行,然后在排序緩沖區 sort buffer 中完成排序操作,所有不是通過索引直接返回排序結果的排序都叫 FileSort 排序

  • Using index:通過有序索引順序掃描直接返回有序數據,這種情況即為 using index,不需要額外排序,操作效率高

  • 根據排序字段建立合適的索引,多字段排序時,也遵循最左前綴法則

  • 盡量使用覆蓋索引

  • 多字段排序,一個升序一個降序,此時需要注意聯合索引在創建時的規則(ASC/DESC

  • 如果不可避免的出現 filesort,大數據量排序時,可以適當增大排序緩沖區大小 sort_buffer_size (默認 256k)

group by優化

分組操作時,索引的使用要滿足最左前綴法制,這樣的效率比較高

limit優化

通過覆蓋索引加子查詢形式進行優化

explain select * from tb_sku t , (select id from tb_sku order by id limit 2000000,10) a where t.id = a.id;
count優化
  • count () 對于返回的結果集,一行行地判斷,如果參數不是 NULL,值加 1,否則不加,最后返回值
  • 用法: count (*)、count (主鍵)、count (字段)、count (1)

效率 : count (字段) < count (主鍵) < count (1) ≈ count (*), 盡量使用 count(*)

update優化

執行更新時,更新的條件一定要有索引,而且這個索引不能失效,不然會從行鎖升級為表鎖,并發性能會降低

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

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

相關文章

ctfshow pwn40

目錄 1. 分析程序 2. 漏洞編寫 3. 漏洞驗證 1. 分析程序 首先檢查程序相關保護&#xff0c;發現程序為32位且只開啟了一個NX保護 checksec pwn 使用IDA進行逆向分析代碼&#xff0c;查看漏洞觸發點&#xff1a; 在main函數中&#xff0c;有一個ctfshow函數&#xff0c;這里…

SQL173 店鋪901國慶期間的7日動銷率和滯銷率

SQL173 店鋪901國慶期間的7日動銷率和滯銷率 SQL題解&#xff1a;店鋪動銷率與滯銷率計算 關鍵&#xff1a;只要當天任一店鋪有任何商品的銷量就輸出該天的結果&#xff0c;即使店鋪901當天的動銷率為0。 潛臺詞&#xff1a;?輸出邏輯與店鋪901的銷售情況無關&#xff0c;只取…

PytorchLightning最佳實踐基礎篇

PyTorch Lightning&#xff08;簡稱 PL&#xff09;是一個建立在 PyTorch 之上的高層框架&#xff0c;核心目標是剝離工程代碼與研究邏輯&#xff0c;讓研究者專注于模型設計和實驗思路&#xff0c;而非訓練循環、分布式配置、日志管理等重復性工程工作。本文從基礎到進階&…

Apache Flink 實時流處理性能優化實踐指南

Apache Flink 實時流處理性能優化實踐指南 隨著大數據和實時計算需求不斷增長&#xff0c;Apache Flink 已經成為主流的流處理引擎。然而&#xff0c;在生產環境中&#xff0c;高并發、大吞吐量和低延遲的業務場景對 Flink 作業的性能提出了更高要求。本文將從原理層面深入解析…

ubuntu上將TempMonitor加入開機自動運行的方法

1.新建一個TempMonitor.sh文件&#xff0c;內容如下&#xff1a;#!/bin/bashcd /fjrobot/ ./TempMonitor &2.執行以下命令chmod x TempMonitor chmod x TempMonitor.sh rm -rf /etc/rc2.d/S56TempMonitor rm -rf /etc/init.d/TempMonitor cp /fjrobot/TempMonitor.sh /etc/…

速賣通自養號測評技術解析:IP、瀏覽器與風控規避的實戰方案

一、速賣通的“春天”來了&#xff0c;賣家如何抓住機會&#xff1f;2025年的夏天&#xff0c;速賣通的風頭正勁。從沙特市場躍升為第二大電商平臺&#xff0c;到8月大促返傭力度升級&#xff0c;平臺對優質商家的扶持政策越來越清晰。但與此同時&#xff0c;競爭也愈發激烈——…

adb: CreateProcessW failed: 系統找不到指定的文件

具體錯誤 adb devices * daemon not running; starting now at tcp:5037 adb: CreateProcessW failed: 系統找不到指定的文件。 (2) * failed to start daemon adb.exe: failed to check server version: cannot connect to daemon 下載最新的platform-tools-windows 下載最新…

Centos安裝HAProxy搭建Mysql高可用集群負載均衡

接上文MYSQL高可用集群搭建–docker https://blog.csdn.net/weixin_43914685/article/details/149647589?spm1001.2014.3001.5501 連接到你搭建的 Percona XtraDB Cluster (PXC) 數據庫集群&#xff0c;實現高可用性和負載均衡&#xff0c;建議使用一個中間件來管理這些連接。…

Sql server開掛的OPENJSON

以前一直用sql server2008&#xff0c;自從升級成sql server2019后&#xff0c;用OPENJSON的感覺像開掛&#xff0c;想想以前表作為參數傳輸時的痛苦&#xff0c;不堪回首。一》不堪回首 為了執行效率&#xff0c;很多時候希望將表作為參數傳給數據庫的存儲過程。存儲過程支持自…

【數據結構】隊列和棧練習

1.用隊列實現棧 225. 用隊列實現棧 - 力扣&#xff08;LeetCode&#xff09; typedef int QDatatype; typedef struct QueueNode {struct QueueNode *next;QDatatype data; }QNode;typedef struct Queue {QNode* head;QNode* tail;QDatatype size; }Que;typedef struct {Que…

LabVIEW二維碼實時識別

?LabVIEW通過機器視覺技術&#xff0c;集成適配硬件構建二維碼實時識別系統。通過圖像采集、預處理、定位及識別全流程自動化&#xff0c;解決復雜環境下二維碼識別效率低、準確率不足問題&#xff0c;滿足工業產線追溯、物流分揀等實時識別需求。應用場景適用于工業產線追溯&…

微服務-springcloud-springboot-Skywalking詳解(下載安裝)

一、SkyWalking核心介紹 1. 什么是SkyWalking&#xff1f; Apache SkyWalking是一款國人主導開發的開源APM&#xff08;應用性能管理&#xff09;系統&#xff0c;2015年由吳晟創建&#xff0c;2017年進入Apache孵化器&#xff0c;2019年畢業成為Apache頂級項目。它通過分布式…

Elasticsearch 字段值過長導致索引報錯問題排查與解決經驗總結

在最近使用 Elasticsearch 的過程中&#xff0c;我遇到了一個 字段值過長導致索引失敗 的問題。經過排查和多次嘗試&#xff0c;最終通過設置字段 "index": false 方式解決。本文將從問題現象、排查過程、問題分析、解決方案和建議等方面&#xff0c;詳細記錄這次踩坑…

使用idea 將一個git分支的部分記錄合并到git另一個分支

場景&#xff1a; 有多個版本分支&#xff0c;需要將其中一個分支的某一兩次提交合并到指定分支上 eg&#xff1a; 將v1.0.0分支中指定提交記錄 合并到 v1.0.1分支中 操作&#xff1a; 步驟一 idea切換項目分支到v1.0.1(需要合并到哪個分支就先站到哪個分支上) 步驟二 在ide…

基于深度學習的圖像分類:使用ShuffleNet實現高效分類

前言 圖像分類是計算機視覺領域中的一個基礎任務&#xff0c;其目標是將輸入的圖像分配到預定義的類別中。近年來&#xff0c;深度學習技術&#xff0c;尤其是卷積神經網絡&#xff08;CNN&#xff09;&#xff0c;在圖像分類任務中取得了顯著的進展。ShuffleNet是一種輕量級的…

OpenGL里相機的運動控制

相機的核心構造一個是glm::lookAt函數&#xff0c;一個是glm::perspective函數&#xff0c;本文相機的一切運動都在于如何構建相應的參數傳入上述兩個函數里。glm::mat4 glm::lookAt(glm::vec3 const &eye,//相機所在位置glm::vec3 const &center,//要凝視的點glm::vec…

java設計模式 -【策略模式】

策略模式定義 策略模式&#xff08;Strategy Pattern&#xff09;是一種行為設計模式&#xff0c;允許在運行時選擇算法的行為。它將算法封裝成獨立的類&#xff0c;使得它們可以相互替換&#xff0c;而不影響客戶端代碼。 核心組成 Context&#xff08;上下文&#xff09;&…

項目重新發布更新緩存問題,Nginx清除緩存更新網頁

server {listen 80;server_name your.domain.com; # 替換為你的域名root /usr/share/nginx/html; # 替換為你的項目根目錄# 規則1&#xff1a;HTML 文件 - 永不緩存# 這是最關鍵的一步&#xff0c;確保瀏覽器總是獲取最新的入口文件。location /index.html {add_header Cache-…

系統架構師:系統安全與分析-思維導圖

系統安全與分析的定義??系統安全與分析是系統架構師在系統全生命周期中貫穿的核心職責&#xff0c;其本質是通過??識別、評估、防控安全風險&#xff0c;并基于數據與威脅情報進行動態分析??&#xff0c;構建從技術到管理的多層次防護體系&#xff0c;確保系統的保密性&a…

利用 Google Guava 的令牌桶限流實現數據處理限流控制

目錄 一、令牌桶限流機制原理 二、場景設計與目標 三、核心實現代碼&#xff08;Java&#xff09; 1. 完整代碼實現 四、運行效果分析 五、應用建議 在高吞吐數據處理場景中&#xff0c;如何限制數據處理速率、保護系統資源、防止下游服務過載是系統設計中重要的環節。本文…