最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL中慢查詢優(yōu)化的技術指南

 更新時間:2025年06月24日 09:12:00   作者:拾荒的小海螺  
后端開發(fā)中,數(shù)據(jù)庫是系統(tǒng)性能瓶頸的高發(fā)地帶,而慢查詢往往是系統(tǒng)響應遲緩的罪魁禍首,本文將全面梳理慢SQL的優(yōu)化思路,感興趣的小伙伴可以了解下

1、簡述

在 Java 后端開發(fā)中,數(shù)據(jù)庫是系統(tǒng)性能瓶頸的高發(fā)地帶,而 慢 SQL 查詢 往往是系統(tǒng)響應遲緩的“罪魁禍首”。本文將全面梳理慢 SQL 的優(yōu)化思路,并結合 Java 示例進行實戰(zhàn)演練。

2、慢查詢的常見表現(xiàn)

慢查詢通常表現(xiàn)為:

  • 接口響應時間緩慢
  • 數(shù)據(jù)庫 CPU 占用高
  • 表鎖、死鎖頻繁
  • Java 應用線程池阻塞嚴重

慢 SQL 的主要成因

成因類型說明
未使用索引全表掃描,查詢耗時
使用了低效的函數(shù)或表達式如 LIKE '%xx%', DATE()
多表關聯(lián)不當join 條件缺失或不走索引
過多返回字段只用到了部分字段卻 SELECT *
where 條件不精準無法過濾大量無關數(shù)據(jù)
數(shù)據(jù)庫設計不合理字段冗余、缺乏范式、字段類型錯誤等

3、慢查詢優(yōu)化的通用思路

加索引(重點)

為 WHERE、JOIN、ORDER BY、GROUP BY 中涉及的字段加索引

避免使用函數(shù)包裹字段,如 LEFT(name, 3),會導致無法使用索引

使用 EXPLAIN 分析執(zhí)行計劃

EXPLAIN SELECT * FROM orders WHERE user_id = 100;

關注字段:

字段說明
type連接類型(越接近 const 越好)
rows掃描行數(shù)(越小越好)
key使用的索引名稱
Extra是否使用臨時表、排序等

分頁優(yōu)化

避免深度分頁:

-- 慢查詢(跳過大量行)
SELECT * FROM orders LIMIT 1000000, 20;

-- 推薦(使用上次主鍵記錄)
SELECT * FROM orders WHERE id > 1000000 LIMIT 20;

拆表分區(qū)

垂直拆分:將大表按字段拆分為多個表

水平分表:按業(yè)務字段分庫分表(如 user_id 分表)

分區(qū)表:MySQL 原生支持(適合歷史歸檔數(shù)據(jù))

減少嵌套子查詢

使用 JOIN 或臨時表替代子查詢,更高效。

SQL 只查需要的字段

-- 慎用
SELECT * FROM user;

-- 推薦
SELECT id, name, email FROM user;

4、慢 SQL 實踐排查與優(yōu)化

示例:慢查詢前后對比

原始 SQL(慢)

SELECT * FROM orders WHERE DATE(create_time) = '2024-01-01';

問題:

  • 使用了 DATE() 函數(shù),索引失效
  • 全表掃描,耗時嚴重

優(yōu)化 SQL(快)

SELECT * FROM orders 
WHERE create_time >= '2024-01-01 00:00:00' 
  AND create_time < '2024-01-02 00:00:00';

優(yōu)點:

  • 范圍查詢走索引
  • 支持時間范圍過濾

Java 中日志配置監(jiān)控慢 SQL

# application.yml 示例(Spring Boot)
logging:
  level:
    com.zaxxer.hikari.HikariConfig: DEBUG
    com.zaxxer.hikari: TRACE
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/demo
    username: root
    password: root
    hikari:
      maximum-pool-size: 10
      connection-timeout: 3000

使用工具(如 p6spy)打印 SQL 及耗時,或開啟 MySQL 慢查詢日志:

-- MySQL 開啟慢查詢日志
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1; -- 超過 1 秒記錄

SQL 優(yōu)化 checklist

  • 是否使用了合適的索引
  • 是否避免了函數(shù)、表達式阻礙索引
  • 是否使用了 EXPLAIN 檢查執(zhí)行計劃
  • 是否合理分頁、避免深度翻頁
  • 是否控制了查詢字段數(shù)量
  • 是否考慮拆分大表或分區(qū)表
  • 是否避免了嵌套子查詢

5、SQL 優(yōu)化實戰(zhàn)樣例

場景 1:模糊查詢優(yōu)化

-- 慢:前置通配符無法使用索引
SELECT * FROM user WHERE name LIKE '%abc%';

-- 優(yōu)化:使用全文索引或右模糊匹配
SELECT * FROM user WHERE name LIKE 'abc%';

場景 2:避免函數(shù)阻礙索引

-- 慢
SELECT * FROM orders WHERE YEAR(create_time) = 2024;

-- 快
SELECT * FROM orders 
WHERE create_time >= '2024-01-01' 
  AND create_time < '2025-01-01';

場景 3:多字段組合索引使用順序

-- 有聯(lián)合索引 (user_id, status)

-- 推薦:user_id 和 status 都參與
SELECT * FROM orders WHERE user_id = 100 AND status = 'PAID';

-- 不推薦:只用 status,索引無法生效
SELECT * FROM orders WHERE status = 'PAID';

6、結語

慢查詢是系統(tǒng)性能優(yōu)化的重要戰(zhàn)場。對于 Java 開發(fā)者而言,理解 SQL 執(zhí)行機制和優(yōu)化原則,比“用緩存”更根本、更有效。

日常開發(fā)中,應做到:

  • 編寫 SQL 前先考慮是否能走索引
  • 查詢慢時第一時間用 EXPLAIN 排查
  • 數(shù)據(jù)庫設計時就考慮查詢結構

到此這篇關于MySQL中慢查詢優(yōu)化的技術指南的文章就介紹到這了,更多相關MySQL慢查詢內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • MySQL的查詢緩存機制基本學習教程

    MySQL的查詢緩存機制基本學習教程

    這篇文章主要介紹了MySQL的查詢緩存機制基本學習教程,默認針對InnoDB存儲引擎下來將,需要的朋友可以參考下
    2015-11-11
  • Mysql將字符串按照指定字符分割的正確方法

    Mysql將字符串按照指定字符分割的正確方法

    字符串分割是我們開發(fā)中經(jīng)常會遇到的一個需求,下面這篇文章主要給大家介紹了關于Mysql將字符串按照指定字符分割的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-05-05
  • mysql備份恢復mysqldump.exe幾個常用用例

    mysql備份恢復mysqldump.exe幾個常用用例

    收集了,一個整理不錯的,mysql備份與恢復用法
    2008-08-08
  • MySQL交叉表實現(xiàn)分享

    MySQL交叉表實現(xiàn)分享

    在某些數(shù)據(jù)庫中有交叉表,但在MySQL中卻沒有這個功能,但網(wǎng)上看到有不少朋友想找出一個解決方法,特發(fā)貼集思廣義
    2012-01-01
  • 圖解MySQL中樂觀鎖扣減庫存原理

    圖解MySQL中樂觀鎖扣減庫存原理

    這篇文章主要為大家詳細介紹了MySQL中樂觀鎖扣減庫存原理的相關知識,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-04-04
  • mysql 不能插入中文問題

    mysql 不能插入中文問題

    當向mysql5.5插入中文時,會出現(xiàn)類似錯誤 ERROR 1366 (HY000): Incorrect string value: '\xD6\xD0\xCE\xC4' for column
    2011-09-09
  • 一次MySQL啟動導致的事故實戰(zhàn)記錄

    一次MySQL啟動導致的事故實戰(zhàn)記錄

    這篇文章主要給大家介紹了一次MySQL啟動導致的事故實戰(zhàn)記錄,記錄了MySQL 啟動成功但未監(jiān)聽端口的解決方法,文中給出了詳細的解決方法,需要的朋友可以參考下
    2021-09-09
  • mysql之TIMESTAMP(時間戳)用法詳解

    mysql之TIMESTAMP(時間戳)用法詳解

    這篇文章主要介紹了mysql之TIMESTAMP(時間戳)用法,需要的朋友可以參考下
    2014-07-07
  • 解決MySQL因不能創(chuàng)建 PID 導致無法啟動的方法

    解決MySQL因不能創(chuàng)建 PID 導致無法啟動的方法

    這篇文章主要給大家介紹了關于解決MySQL因不能創(chuàng)建 PID 導致無法啟動的方法,文中通過示例代碼介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面跟著小編一起來學習學習吧。
    2017-06-06
  • mysql入門之1小時學會MySQL基礎

    mysql入門之1小時學會MySQL基礎

    今天剛好看到了SYZ01的這篇mysql入門文章,感覺對于想學習mysql的朋友是個不錯的資料,腳本之家特分享一下,需要的朋友可以參考下
    2018-01-01

最新評論

宁德市| 罗源县| 邯郸市| 青阳县| 昆明市| 平乡县| 定边县| 稷山县| 乌审旗| 靖宇县| 莆田市| 延川县| 年辖:市辖区| 黄陵县| 潞西市| 眉山市| 蓝山县| 叙永县| 宜都市| 伊春市| 会理县| 抚顺县| 翼城县| 承德市| 沙湾县| 屯留县| 易门县| 绿春县| 惠州市| 建湖县| 柘城县| 巴南区| 西乌| 西乌珠穆沁旗| 鄂尔多斯市| 丰城市| 土默特左旗| 庐江县| 册亨县| 吉林省| 新源县|