【Java后端】MySQL 常見 SQL 語句優化指南

在 MySQL 中,SQL 優化是性能調優的核心環節,尤其是在數據量大、并發高的情況下。這里整理一份 MySQL 常見 SQL 語句優化指南,從查詢寫法、索引使用到執行計劃分析,涵蓋實用技巧:


1. 查詢語句層面的優化

? 避免 SELECT *

  • 問題:會取出不必要的列,增加 I/O 和網絡傳輸。
  • 優化:只取需要的列。
-- 不推薦
SELECT * FROM user;-- 推薦
SELECT id, username, email FROM user;

? 減少子查詢,優先使用 JOIN

  • 問題:子查詢可能生成臨時表,效率低。
  • 優化:能用 JOIN 就不用子查詢。
-- 子查詢
SELECT name FROM employee WHERE dept_id IN (SELECT id FROM department WHERE name = '研發部'
);-- JOIN 優化
SELECT e.name 
FROM employee e 
JOIN department d ON e.dept_id = d.id
WHERE d.name = '研發部';

? 合理使用 LIMIT

  • 問題LIMIT offset, size 偏移量大時性能差。
  • 優化:利用索引字段加條件過濾。
-- 慢
SELECT * FROM orders LIMIT 100000, 20;-- 推薦(基于自增主鍵優化)
SELECT * FROM orders 
WHERE id > 100000 
LIMIT 20;

? 避免 OR,改用 INUNION ALL

  • 問題OR 會導致索引失效。
  • 優化:使用 INUNION ALL
-- 不推薦
SELECT * FROM user WHERE status = 1 OR status = 2;-- 推薦
SELECT * FROM user WHERE status IN (1, 2);

? 模糊查詢優化

  • 問題LIKE '%abc' 不能走索引。

  • 優化

    • 改寫為 LIKE 'abc%'(前綴匹配可以走索引)。
    • 或者使用 全文索引 (FULLTEXT) / ElasticSearch。
-- 慢
SELECT * FROM article WHERE title LIKE '%優化%';-- 推薦
ALTER TABLE article ADD FULLTEXT(title);
SELECT * FROM article WHERE MATCH(title) AGAINST('優化');

? 避免在 WHERE 中對列做函數運算

  • 問題:索引失效。
  • 優化:把函數移到等式右邊。
-- 不推薦
SELECT * FROM user WHERE YEAR(create_time) = 2024;-- 推薦
SELECT * FROM user 
WHERE create_time >= '2024-01-01' AND create_time < '2025-01-01';

2. 索引使用優化

? 建立合適的索引

  • 單列索引:適合高頻查詢字段。
  • 復合索引:遵循 最左前綴原則
CREATE INDEX idx_user_email ON user(email);
CREATE INDEX idx_order_user_time ON orders(user_id, create_time);

? 覆蓋索引 (Covering Index)

  • 查詢字段都在索引中,不需要回表。
-- 索引包含 (user_id, create_time)
SELECT user_id, create_time 
FROM orders 
WHERE user_id = 123;

? 避免過多索引

  • 問題:索引會增加寫操作開銷。
  • 優化:只在查詢頻繁的字段建索引,刪除無用索引。

3. 執行計劃分析

? 使用 EXPLAIN

分析查詢是否走索引。

EXPLAIN SELECT * FROM orders WHERE user_id = 100;

重點關注字段:

  • type:優先級 system > const > eq_ref > ref > range > index > ALL
  • key:實際使用的索引
  • rows:掃描行數,越少越好

4. 表結構與數據優化

  • 分庫分表:大表 (>千萬行) 考慮拆分。
  • 冷熱數據分離:歷史數據歸檔,減少主表數據量。
  • 合理字段類型:能用 INT 不用 BIGINT,能用 CHAR(10) 不用 VARCHAR(255)

5. 常見優化 checklist

  • 是否避免了 SELECT *
  • 是否有合適的索引
  • 是否避免在索引列上使用函數、計算
  • 是否避免大 offset 的分頁
  • 是否利用了 EXPLAIN 分析執行計劃

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

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

相關文章

Golang 面試題「高級」

以下是 100 道 Golang 高級面試題及答案&#xff0c;聚焦語言底層實現、并發深度優化、性能調優、源碼級理解等核心方向&#xff0c;適合資深開發者或架構師級別的面試場景&#xff1a; 一、GPM 調度模型與并發深度 問題&#xff1a;Goroutine 的棧空間初始大小是多少&#xff…

WebGIS視角:體感溫度實證,哪座“火爐”火力全開?

目錄 前言 一、火爐城市空間分布及特點 1、空間分布 2、氣候特點 二、數據來源及技術實現 1、數據來源介紹 2、技術路線簡介 三、WebGIS系統實現 1、后端設計與實現 2、前端程序實現 四、成果展示 1、整體展示 2、蒸烤模式城市 3、舒適城市 五、總結 前言 “火爐…

《數據結構入門:順序表的結構設計與核心操作(C 語言版)》

目錄 一. 線性表 二. 順序表的概念與結構 2.1 核心概念 2.2 兩種常見結構 靜態順序表 動態順序表 2.3 核心區別對比 四. 順序表的實現 4.1 順序表的定義 4.2 順序表初始化 4.3 動態順序表容量檢查與擴容 4.4 動態順序表插入數據 4.4.1 頭插 4.4.2 尾插 4.4.3 指…

[Maven 基礎課程]Maven 是什么

Maven 的官方網站&#xff1a;https://maven.apache.org/ 來自 Maven 官網的對于 Maven 是什么的描述&#xff1a; Apache Maven is a build tool for Java projects. Using a project object model (POM), Maven manages a project’s compilation, testing, and documentat…

【MATLAB例程】三維組合導航,濾波使用EKF,帶嚴格的慣導推算、雅克比求解函數,圖像對比濾波前后的速度、位置、姿態

文章目錄程序介紹系統建模濾波框架仿真設置性能對比代碼優點運行結果MATLAB源代碼程序介紹 本程序實現了 三維狀態量的擴展卡爾曼濾波&#xff08;EKF&#xff09;組合導航仿真&#xff0c;采用嚴格的15維誤差狀態模型&#xff0c;狀態向量包括&#xff1a; x[pxpypzvxvyvz?θ…

港資企業在大陸,如何靠 SD-WAN 專線暢連香港?

在當前市場形勢下&#xff0c;港資企業在大陸的業務布局不斷拓展&#xff0c;企業間訪問香港總部系統以及香港員工到內陸出差時訪問相關系統&#xff0c;成為日常運營的高頻需求。然而&#xff0c;網絡問題卻常常阻礙業務的順暢開展&#xff0c;基于 SD-WAN 專線的到香港加速網…

并發編程——08 Semaphore源碼分析

1 概述Semaphore 是基于 AQS CAS 實現的&#xff0c;可根據構造參數的布爾值&#xff0c;選擇使用公平鎖&#xff0c;還是非公平鎖。Semaphore 默認使用非公平鎖&#xff1b;2 構造函數 // AQS的實現 private final Sync sync;// 默認使用非公平鎖 public Semaphore(int permi…

Java全棧開發面試實戰:從基礎到微服務的深度解析

Java全棧開發面試實戰&#xff1a;從基礎到微服務的深度解析 一、面試開場 面試官&#xff08;中年工程師&#xff0c;穿著休閑但專業&#xff09;&#xff1a;你好&#xff0c;我是李工&#xff0c;今天來聊一下你的技術背景。你之前在XX科技做全棧開發&#xff0c;對吧&#…

CVPR深度學習論文創新合集拆解:模型訓練速度算提升

關注gongzhonghao【CVPR頂會精選】大語言模型擴散Transformer的深度融合&#xff0c;讓文本到圖像生成更精準、細節更豐富&#xff1b;同時&#xff0c;專家軌跡正則化深度強化學習在自動對焦中的穩定加速表現&#xff0c;也展示了深度學習與軌跡建模結合的潛力。這樣的組合正在…

【智能體】零代碼學習 Coze 智能體(2)創建智能體的完整步驟

歡迎關注【AGI使用教程】 專欄 【智能體】零代碼學習 Coze 智能體&#xff08;1&#xff09; 【智能體】零代碼學習 Coze 智能體&#xff08;2&#xff09; 【智能體】零代碼學習 Coze 智能體&#xff08;1&#xff09;1、登錄 Coze 平臺2、創建智能體3、智能體編排頁面4、編寫…

WPF和WinFrom區別

WPF 總結Windows Presentation Foundation (WPF) 是微軟開發的一個用于構建 Windows 桌面應用程序的用戶界面框架。它基于 .NET Framework&#xff0c;提供豐富的圖形、動畫和數據綁定功能&#xff0c;幫助開發者創建現代化、高性能的應用程序。以下是其核心要點總結&#xff1…

數據庫原理及應用_數據庫基礎_第3章數據庫編程_常用系統函數

前言 "<數據庫原理及應用>(MySQL版)".以下稱為"本書"中3.1.2節內容 引入 數據庫常用系統函數的分析.上一篇帖子分析了,數據庫函數需要看看能否被C語言函數替代 1.字符串函數 1)計算字符串字符數的函數和字符串長度的函數 語法: CHAR_LENGTH(str)…

回歸問題的損失函數

簡單來說&#xff0c;?在回歸問題中&#xff0c;最常用的損失函數是均方誤差&#xff08;MSE, Mean Squared Error&#xff09;和平均絕對誤差&#xff08;MAE, Mean Absolute Error&#xff09;?。它們衡量的都是模型預測值&#xff08;?&#xff09;與真實值&#xff08;y…

吳恩達機器學習(四)

一、神經網絡神經元模擬邏輯單元&#xff1a;神經網絡簡單模型&#xff1a;神經網絡中的前向傳播過程&#xff1a;依次計算激活項&#xff0c;從輸入層到隱藏層再到輸出層的過程。樣例&#xff1a;多元分類&#xff1a;

【重學 MySQL】九十三、MySQL的字符集的修改與底層原理詳解

【重學 MySQL】九十三、MySQL的字符集的修改與底層原理詳解一、字符集修改方法1. **配置文件修改**2. **SQL命令修改**3. **數據遷移方案**二、底層原理與注意事項1. **字符集與排序規則**2. **存儲與性能影響**3. **數據一致性風險**三、常見問題解決1. **亂碼問題**2. **性能…

pdf 轉圖片工具實現

一、安裝 sudo yum install poppler-utils pdftoppm -v pdftoppm -png -r 300 a.pdf /tmp/page 運行效果&#xff1a; PDF轉圖片工具 - 在線PDF轉PNG/JPG/TIFF轉換器 | 免費在線工具 后臺實現&#xff1a; using System.Diagnostics; using System.IO.Compression;namespac…

Zynq開發實踐(FPGA之輸入、輸出整合)

【 聲明&#xff1a;版權所有&#xff0c;歡迎轉載&#xff0c;請勿用于商業用途。 聯系信箱&#xff1a;feixiaoxing 163.com】fpga開發的時候習慣上先把功能拆分成若干個模塊。針對這些模塊&#xff0c;一個一、個實現好之后&#xff0c;再用wire連接即可。這一點有點像軟件編…

【Linux基礎】深入理解計算機啟動原理:MBR主引導記錄詳解

目錄 引言 1 硬盤分區初始化概述 1.1 為什么需要硬盤分區 1.2 硬盤分區格式的發展 1.3 分區初始化的基本流程 2 MBR詳解 2.1 MBR的定義與位置 2.2 MBR的結構詳解 2.3 分區表結構詳解 2.4 MBR的工作原理 2.5 MBR的引導程序 3 MBR的局限性 3.1 硬盤容量限制 3.2 分…

Linux 線程同步

線程同步 由于線程共享內存&#xff0c;訪問共享數據&#xff08;全局變量、堆內存&#xff09;必須進行同步&#xff0c;以防止競態條件&#xff08;Race Conditions&#xff09;導致數據不一致或程序崩潰。 子線程沒有獨立的地址空間&#xff0c;數據通常是共享的&#xff1b…

世界模型的典型框架與分類

1.概述 人類和動物智能的一個重要方面是我們對世界的內部模型。我們使用這個模型來預測我們的行為將如何影響我們的環境&#xff0c;預測未來的事件&#xff0c;并計劃復雜的行動序列以實現目標。當前大多數機器學習研究都集中在被動理解數據的模型上&#xff0c;例如圖像分類…