MySQL 高效 SQL 使用技巧詳解

MySQL 高效 SQL 使用 技巧詳解

一、為什么需要優化 SQL?

  • 性能瓶頸:慢查詢導致數據庫負載升高,響應時間延長。
  • 資源浪費:低效 SQL 可能占用大量 CPU、內存和磁盤 I/O。
    目標:通過優化 SQL 將查詢性能提升 10 倍以上,降低硬件成本。

二、核心優化原則

  1. 索引優先:為高頻查詢字段添加索引。
  2. 減少數據量:避免全表掃描,縮小查詢范圍。
  3. 簡化邏輯:用 JOIN 替代子查詢,避免復雜嵌套。
  4. 事務控制:縮短事務長度,減少鎖競爭。

三、高效 SQL 實戰技巧

1. 索引優化

(1)創建復合索引
-- 為 (user_id, create_time) 創建復合索引
CREATE INDEX idx_user_time ON orders(user_id, create_time);

適用場景:排序、范圍查詢(如 BETWEEN)。

(2)覆蓋索引
-- 查詢字段包含在索引中,避免回表
SELECT user_id, create_time FROM orders WHERE user_id = 100;

索引建議

CREATE INDEX idx_user_time_covering ON orders(user_id, create_time) INCLUDE (status);
(3)避免索引失效
錯誤寫法正確寫法原因
WHERE price > 100 OR status = 'paid'WHERE price > 100 AND status = 'paid'OR 導致索引失效
WHERE name LIKE '%test'WHERE name LIKE 'test%'前綴模糊查詢可利用索引

2. 查詢優化

(1)使用 EXPLAIN 分析執行計劃
EXPLAIN SELECT * FROM users WHERE age > 30;

關鍵指標

  • type: 連接類型(理想值:refeq_ref)。
  • key: 使用的索引(NULL 表示全表掃描)。
  • rows: 預估掃描行數(越小越好)。
(2)分頁優化

原查詢(慢):

SELECT * FROM products LIMIT 100000, 10;

優化后(利用覆蓋索引):

SELECT id, name FROM products 
WHERE id > (SELECT id FROM products LIMIT 100000, 1)
LIMIT 10;
(3)批量操作替代循環

錯誤寫法

for item in data:cursor.execute("INSERT INTO logs VALUES (%s)", item)

正確寫法

INSERT INTO logs (col1, col2) VALUES 
(1, 'a'), (2, 'b'), (3, 'c');

3. 事務與鎖優化

(1)減少鎖粒度
-- 行級鎖示例(InnoDB 默認)
UPDATE users SET balance = balance - 100 WHERE id = 100;
(2)縮短事務長度

反模式

START TRANSACTION;
SELECT * FROM large_table; -- 耗時操作
UPDATE orders SET status = 'paid';
COMMIT;

優化后

START TRANSACTION;
UPDATE orders SET status = 'paid';
COMMIT;

4. 存儲引擎選擇

引擎特點適用場景
InnoDB支持事務、行級鎖、外鍵高并發讀寫(如電商訂單)
MyISAM表級鎖、不支持事務讀多寫少(如日志表)
Memory內存存儲、速度極快臨時數據緩存

四、高級優化技巧

1. 子查詢轉 JOIN

原查詢

SELECT * FROM orders 
WHERE user_id IN (SELECT id FROM users WHERE city = 'Shanghai');

優化后

SELECT o.* 
FROM orders o
JOIN users u ON o.user_id = u.id
WHERE u.city = 'Shanghai';

2. 避免 SELECT *

反模式

SELECT * FROM employees;

正確寫法

SELECT id, name, email FROM employees;

3. 使用 LIMIT 限制結果集

-- 快速獲取最新記錄
SELECT * FROM logs ORDER BY create_time DESC LIMIT 10;

五、實戰案例:優化電商訂單查詢

優化前 SQL

SELECT * FROM orders 
WHERE user_id = 100 AND status = 'paid'
ORDER BY create_time DESC;

問題

  • 全表掃描(無索引)。
  • 回表查詢所有字段。

優化步驟

  1. 添加復合索引

    CREATE INDEX idx_user_status_time ON orders(user_id, status, create_time);
    
  2. 僅查詢必要字段

    SELECT id, amount, create_time 
    FROM orders 
    WHERE user_id = 100 AND status = 'paid'
    ORDER BY create_time DESC;
    

優化后效果

  • 查詢時間:從 2.1 秒降至 0.05 秒。
  • 索引覆蓋度:100%(無需回表)。

六、注意事項

1. 索引維護成本

  • 索引過多會降低寫入性能。
  • 建議:為查詢頻率高的字段創建索引。

2. 慢查詢日志

-- 開啟慢查詢日志(超過 2 秒的查詢)
SET GLOBAL slow_query_log = ON;
SET GLOBAL long_query_time = 2;

3. 測試環境驗證

# 使用 sysbench 壓測
sysbench --test=oltp --oltp-table-size=1000000 --mysql-user=root run

七、總結:高效 SQL 檢查表

優化項操作工具/命令
索引使用 EXPLAIN 分析執行計劃EXPLAIN
查詢避免 SELECT *,使用覆蓋索引EXPLAIN
事務縮短事務長度,減少鎖競爭監控 InnoDB_row_lock_waits
存儲引擎根據場景選擇合適引擎SHOW TABLE STATUS
慢查詢開啟慢查詢日志并分析pt-query-digest

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

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

相關文章

AI基礎03-視頻數據采集

上篇文章我們學習了圖片的數據采集,今天主要了解一下視頻數據采集的方法。視頻是由一系列圖像構成的,其中每一張圖片就是一幀。視頻數據采集方法通常有自動圖像采集和基于處理器的圖像采集兩種。我們學習一下如何利用python 工具和筆記本計算機攝像頭進行…

Scala 數組

Scala 數組 引言 Scala 作為一門多范式編程語言,融合了面向對象和函數式編程的特點。數組是編程語言中非常基礎和常見的數據結構,在 Scala 中也不例外。本文將詳細介紹 Scala 中的數組,包括其定義、操作以及在實際開發中的應用。 Scala 數…

Text-to-SQL將自然語言轉換為數據庫查詢語句

有關Text-To-SQL方法,可以查閱我的另一篇文章,Text-to-SQL方法研究 直接與數據庫對話-text2sql Text2sql就是把文本轉換為sql語言,這段時間公司有這方面的需求,調研了一下市面上text2sql的方法,比如阿里的Chat2DB,麻…

golang 的strconv包常用方法

目錄 1. 字符串與整數的轉換 2. 字符串與浮點數的轉換 3. 布爾值的轉換 4. 字符串的轉義 5. 補充:rune 類型的使用 方法功能詳解 代碼示例: 1. 字符串與整數的轉換 方法名稱功能描述示例Atoi將字符串轉換為十進制整數。strconv.Atoi("123&q…

MATLAB詳細圖文安裝教程(附安裝包)

前言 MATLAB(Matrix Laboratory)是由MathWorks公司開發的一款高性能的編程語言和交互式環境,主要用于數值計算、數據分析和算法開發。內置數學函數和工具箱豐富,開發效率高,特別適合矩陣運算和領域特定問題。接下來就…

ShapeCrawler:.NET開發者的PPTX操控魔法

引言 在當今的軟件開發領域,隨著數據可視化和信息展示需求的不斷增長,處理 PPTX 文件的場景日益頻繁。無論是自動化生成報告、批量制作演示文稿,還是對現有 PPT 進行內容更新與格式調整,開發者都需要高效的工具來完成這些任務。傳…

HTML5貪吃蛇游戲開發經驗分享

HTML5貪吃蛇游戲開發經驗分享 這里寫目錄標題 HTML5貪吃蛇游戲開發經驗分享項目介紹技術棧核心功能實現1. 游戲初始化2. 蛇的移動控制3. 碰撞檢測4. 食物生成 開發心得項目收獲后續優化方向結語 項目介紹 在這個項目中,我使用HTML5 Canvas和原生JavaScript實現了一…

有關pip與conda的介紹

Conda vs. Pip vs. Virtualenv 命令對比 任務Conda 命令Pip 命令Virtualenv 命令安裝包conda install $PACKAGE_NAMEpip install $PACKAGE_NAMEX更新包conda update --name $ENVIRONMENT_NAME $PACKAGE_NAMEpip install --upgrade $PACKAGE_NAMEX更新包管理器conda update con…

【Linux】調試器——gdb使用

目錄 一、預備知識 二、常用指令 三、調試技巧 (一)監視變量的變化指令 watch (二)更改指定變量的值 set var 正文 一、預備知識 程序的發布形式有兩種,debug和release模式,Linux gcc/g出來的二進制…

【Ubuntu常用命令】

1.將本地服務器文件或文件夾傳輸到遠程服務器 文件 scp /data/a.txt administrator10.60.51.20:/home/administrator/ 文件夾 scp -r /data/ administrator10.60.51.20:/home/administrator/ 2.從遠程服務器傳輸文件到本地服務器 scp administrator10.60.51.20:/data/a.txt /h…

golang 的time包的常用方法

目錄 time 包方法總結 類型 time.Time 的方法 庫函數 代碼示例: time 包方法總結 類型 time.Time 的方法 方法名描述示例               ?Now()獲取當前時間和日期time.Now()Format()格式化時間為字符串time.Now().Format("2006-01-02 15…

Elasticsearch:使用 Azure AI 文檔智能解析 PDF 文本和表格數據

作者:來自 Elastic James Williams 了解如何使用 Azure AI 文檔智能解析包含文本和表格數據的 PDF 文檔。 Azure AI 文檔智能是一個強大的工具,用于從 PDF 中提取結構化數據。它可以有效地提取文本和表格數據。提取的數據可以索引到 Elastic Cloud Serve…

【ArcGIS操作】ArcGIS 進行空間聚類分析

ArcGIS 是一個強大的地理信息系統(GIS)軟件,主要用于地理數據的存儲、分析、可視化和制圖 啟動 ArcMap 在 Windows 中,點擊“開始”菜單,找到 ArcGIS文件夾,然后點擊 ArcMap 添加數據 添加數據 - 點擊工具…

RabbitMQ消息相關

MQ的模式: 基本消息模式:一個生產者,一個消費者work模式:一個生產者,多個消費者訂閱模式: fanout廣播模式:在Fanout模式中,一條消息,會被所有訂閱的隊列都消費。 在廣播…

緩存使用紀要

一、本地緩存:Caffeine 1、簡介 Caffeine是一種高性能、高命中率、內存占用低的本地緩存庫,簡單來說它是 Guava Cache 的優化加強版,是當下最流行、最佳(最優)緩存框架。 Spring5 即將放棄掉 Guava Cache 作為緩存機…

2025年3月29日筆記

問題&#xff1a;創建一個長度為99的整數數組&#xff0c;輸出數組的每個位置數字是幾&#xff1f; 解題思路&#xff1a; 1.因為題中沒有明確要求需要輸入,所以所有類型的答案都需要寫出 解法1&#xff1a; #include<iostream> #include<bits/stdc.h> using n…

hadoop相關面試題以及答案

什么是Hadoop&#xff1f;它的主要組件是什么&#xff1f; Hadoop是一個開源的分布式計算框架&#xff0c;用于處理大規模數據的存儲和計算。其主要組件包括Hadoop Distributed File System&#xff08;HDFS&#xff09;和MapReduce。 解釋HDFS的工作原理。 HDFS采用主從架構&…

微信小程序:數據拼接方法

1. 使用 concat() 方法拼接數組 // 在原有數組基礎上拼接新數組 Page({data: {originalArray: [1, 2, 3]},appendData() {const newData [4, 5, 6];const combinedArray this.data.originalArray.concat(newData);this.setData({originalArray: combinedArray});} }) 2. 使…

Python之貪心算法

Python實現貪心算法(Greedy Algorithm) 概念 貪心算法是一種在每一步選擇中都采取當前狀態下最優的選擇&#xff0c;從而希望導致結果是全局最優的算法策略。 基本特點 局部最優選擇&#xff1a;每一步都做出當前看起來最佳的選擇不可回退&#xff1a;一旦做出選擇&#xf…

【 <二> 丹方改良:Spring 時代的 JavaWeb】之 Spring Boot 中的 AOP:實現日志記錄與性能監控

<前文回顧> 點擊此處查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12907601&sharereferPC&sharesourceFoyoDesigner&sharefromfrom_link <今日更新> 一、開篇整…