慢 SQL接口性能優化實戰

在對某電商項目進行接口性能壓測時,發現 /product/search 接口響應緩慢,存在明顯性能瓶頸。通過慢查詢日志排查和 SQL 優化,最終實現了接口響應速度的顯著提升。本文完整還原此次優化過程,特別強調操作步驟和問題分析過程,為后續類似問題提供可復用參考。

一、問題背景

接口地址:

GET /product/search?keyword=手機&pageNum=1&pageSize=10

該接口支持關鍵詞模糊搜索和分頁查詢,是產品列表頁的重要入口。

二、JMeter 接口壓測

使用 JMeter 進行 50 和 100 并發下的性能測試,結果如下:
在這里插入圖片描述

在這里插入圖片描述

并發數樣本數平均響應時間(ms)最小值最大值標準差吞吐量(req/s)
505058692364846519395.3
1001001079123642154357276.71

接口平均響應時間達到 5~10 秒,明顯偏高,響應抖動也較嚴重。

三、開啟 MySQL 慢查詢日志

為定位 SQL 性能瓶頸,需先開啟 MySQL 的慢查詢日志。步驟如下:

1. 登錄數據庫

mysql -uroot -p

2. 臨時開啟慢查詢日志(即時生效)

SET GLOBAL slow_query_log = 1;
SET GLOBAL slow_query_log_file = '/var/lib/mysql/mysql-slow.log';
SET GLOBAL long_query_time = 1;  -- 超過1秒即記錄為慢查詢
SET GLOBAL log_queries_not_using_indexes = 1;

3. 查看設置是否生效

SHOW VARIABLES LIKE 'slow_query_log%';
SHOW VARIABLES LIKE 'long_query_time';

在這里插入圖片描述

4. 永久配置(推薦)
編輯配置文件 /etc/my.cnf:

[mysqld]
slow_query_log = 1
slow_query_log_file = /var/lib/mysql/mysql-slow.log
long_query_time = 1
log_queries_not_using_indexes = 1

在這里插入圖片描述

重啟 MySQL 生效:

docker restart mysql

四、慢 SQL 日志分析

壓測執行期間,慢查詢日志出現以下記錄:
tail -n 50 /var/lib/mysql/mysql-slow.log
在這里插入圖片描述


Query_time: 2.606188  Rows_examined: 118788
SELECT id, name, price, ...
FROM pms_product
WHERE delete_status = 0AND publish_status = 1AND name LIKE '%手機%'
LIMIT 10;

分析結果:

  • LIKE ‘%手機%’ 會導致 無法使用索引;
  • Rows_examined 超過 11 萬,全表掃描嚴重拖慢性能;
  • 查詢時間達 2.606188 秒,符合慢 SQL 記錄門檻;
  • 實際僅返回幾行數據,說明檢索效率極低。

五、SQL 優化策略

? 優化 1:添加聯合索引(過濾條件優化)

CREATE INDEX idx_publish_delete ON pms_product (publish_status, delete_status);

目標:加速前置過濾條件,縮小掃描范圍。

? 優化 2:替換模糊搜索模式(條件允許時)
將:

name LIKE '%手機%'

替換為前綴匹配:

name LIKE '手機%'

并添加索引:

CREATE INDEX idx_name ON pms_product(name);

說明:前綴匹配可命中索引,大幅提升查詢性能。

? 優化 3:MySQL FULLTEXT 索引(英文關鍵詞可用)

ALTER TABLE pms_product ADD FULLTEXT(name);

使用:

MATCH(name) AGAINST('手機');

注意:MySQL 原生不支持中文分詞,適用于英文搜索場景。

? 優化 4:引入 Elasticsearch(推薦)
對于中文模糊搜索,應優先考慮引入 Elasticsearch:

  • 支持中文分詞(如 IK Analyzer);
  • 查詢速度快,靈活性強;
  • 支持高亮、相關度排序、糾錯、自動補全等高級搜索功能。

七、總結

🎯 優化流程回顧:

  1. 壓測工具發現接口響應慢
  2. 開啟慢查詢日志,定位 SQL 問題
  3. 分析執行計劃,確認未命中索引、全表掃描
  4. 針對性優化索引和搜索邏輯
  5. 回歸驗證優化效果

📌 經驗建議:

建議說明
開啟慢查詢日志持續監控系統中潛在瓶頸 SQL
適當控制模糊查詢的使用%關鍵詞% 頻繁使用時應考慮全文檢索方案
數據量較大時應提前評估查詢方式多字段過濾、分頁查詢要設計好索引策略
中文搜索建議引入搜索引擎如 Elasticsearch,提升性能和用戶體驗

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

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

相關文章

【C#】在WinForms中實現控件跨TabPage共享的優雅方案

文章目錄一、問題背景二、基本實現方案1. 通過修改Parent屬性實現控件移動三、進階優化方案1. 創建控件共享管理類2. 使用用戶控件封裝共享內容四、方案對比與選擇建議五、最佳實踐建議六、完整示例代碼一、問題背景 在Windows窗體應用程序開發中,我們經常遇到需要…

Android Camera openCamera

由頭 今日調休,終于終于閑下來了,可以寫一下博客了,剛好打開自己電腦,就有四年前下的谷歌Android 12源碼,不是很舊,剛好夠用,不用再另外下載新源碼了,不得不感慨這時間過得真快啊~廢…

神經網絡——池化層

目錄 池化層 最大池化層 MaxPool2d 最大池化操作圖示 最大池化操作代碼演示 綜合代碼案例 池化層 池化層(Pooling Layer) 核心作用:通過降采樣減少特征圖尺寸,降低計算量,增強特征魯棒性。 1. 常見類型 …

Android 默認圖庫播放視頻沒有自動循環功能,如何添加2

Android 默認圖庫播放視頻沒有自動循環功能, 如何添加 按如下方式修改可以添加 開發云 - 一站式云服務平臺 --- a/packages/apps/Gallery2/src/com/android/gallery3d/app/MovieActivity.java +++ b/packages/apps/Gallery2/src/com/android/gallery3d/app/MovieActivity.java…

數字孿生賦能智慧能源電力傳輸管理新模式

在“雙碳”戰略和能源數字化轉型的雙重驅動下,智慧能源系統亟需更高效、精細和智能的管理手段。數字孿生技術作為融合物理世界與數字空間的橋梁,為電力傳輸系統的全生命周期管理提供了強有力的技術支撐。本文聚焦數字孿生在智慧能源電力傳輸中的應用&…

Jmeter的元件使用介紹:(二)線程組詳解

Jmeter線程組默認包含三種:線程組、setUp線程組、tearDown線程組。線程組之間的執行順序為:setUp線程組->線程組->tearDown線程組。多數情況都是選用線程組,setUp線程組用于做一些腳本的前置準備,比如:跨線程組設…

AI替代人工:浪潮中的沉浮與覺醒

當AlphaGo以4:1的比分戰勝圍棋大師李世石之時,人機博弈的疆界被重新劃定;當工廠車間里機械臂以驚人精度與不知疲倦的姿態取代了工人重復的手勢;當客服電話那頭響起的不再是溫存人聲,而成了準確但缺乏溫度的AI語音;當算…

數學建模--matplot.pyplot(結尾附線條樣式表格)

matplotlib.pyplot繪圖接口 1. 用法 導入模塊 import matplotlib.pyplot as plt import numpy as np # 用于生成示例數據繪制簡單圖表 # 生成數據 x np.linspace(0, 10, 100) y np.sin(x)# 創建圖形和坐標軸 plt.figure(figsize(8, 4)) # 設置圖表大小 plt.plot(x, y, …

NumPy 實現三維旋轉變換

在三維空間中,物體的旋轉變換是計算機圖形學、機器人學以及三維建模等領域中一個至關重要的操作。這種變換可以通過構造特定的旋轉矩陣并將其應用于三維點或向量來實現。本文將深入探討如何利用 NumPy 這一強大的 Python 科學計算庫來實現三維旋轉變換,從基本的數學原理到具體…

基于Springboot的中藥商城管理系統/基于javaweb的中藥材銷售系統

管理員:登錄,個人中心,用戶管理,藥材分類管理,藥材信息管理,藥材入庫管理, 藥材出庫管理,訂單管理,云端藥館,系統設置用戶:注冊,登錄&…

試用SAP BTP 02A:試用SAP HANA Cloud

進入SAP BTP主控室 -> 子賬 -> 服務市場,選擇【數據和分析】-> 點擊SAP HANA Cloud點擊創建選擇服務、計劃、運行時環境、空間,輸入實例名稱,點擊下一步在JSON文件中配置HANA管理員密碼,點擊下一步審核hana 實例信息&…

純CPU場景下C++的分布式模型訓練框架設計思路

0. 參數分配 稠密參數 → MPI 集合通信(All-Reduce / Broadcast / Reduce-Scatter)。稀疏參數 → brpc Parameter Server 異步推拉。 完全去掉 NCCL/GPU 相關部分。1. 整體拓撲 ┌----------------┐ ┌----------------┐ │ Worker-0 │…

訓練日志7.21

conda環境,服務器原因無法使用,需重新搭建 學習一下預訓練和微調相關內容,對于預訓練整體的流程,還不太清楚,自己估計是訓練不動,只能微調

Java 高頻算法

Java高頻算法面試題 以下是Java面試中常見的高頻算法題目&#xff0c;涵蓋了數據結構、算法思想和實際應用場景。 一、數組與字符串 1. 兩數之和 public int[] twoSum(int[] nums, int target) {Map<Integer, Integer> map new HashMap<>();for (int i 0; i <…

汽車控制系統——CAPL腳本

CAPL (Communication Access Programming Language) 是一種專門用于嵌入式系統和汽車電子測試領域的編程語言&#xff0c;特別是在 CAN (Controller Area Network) 總線和汽車網絡通信系統中被廣泛使用。它由 Vector 公司開發&#xff0c;主要用于編寫與汽車控制單元 (ECU) 進行…

深入解析Hive SQL轉MapReduce的編譯原理:從AST抽象語法樹到Operator執行樹

Hadoop與Hive SQL簡介Hadoop生態系統的核心架構作為大數據處理領域的基石&#xff0c;Hadoop生態系統采用分布式架構設計&#xff0c;其核心組件構成了一套完整的解決方案框架。HDFS&#xff08;Hadoop Distributed File System&#xff09;作為底層存儲系統&#xff0c;采用主…

在 React 中實現全局防復制hooks

用于防止頁面內容被復制、剪切或通過右鍵菜單操作。它接受三個可配置參數&#xff1a;disableCopy&#xff08;禁用復制&#xff0c;默認true&#xff09;、disableCut&#xff08;禁用剪切&#xff0c;默認true&#xff09;和 disableContextMenu&#xff08;禁用右鍵菜單&…

InfluxDB HTTP API 接口調用詳解(一)

引言 ** 在當今數字化時代&#xff0c;時間序列數據無處不在&#xff0c;從物聯網設備產生的傳感器數據&#xff0c;到金融領域的交易記錄&#xff0c;再到系統運維中的監控指標&#xff0c;這些數據蘊含著豐富的信息&#xff0c;對于企業的決策制定、業務優化以及問題排查等…

使用JMeter進行壓力測試(以黑馬點評為例、詳細圖解)

目錄 一、前言 二、使用JMeter進行壓力測試 一、前言 本博客主要記錄如何使用JMeter進行壓力測試&#xff0c;以黑馬點評P44利用互斥鎖解決緩存擊穿問題課程為例。至于如何完成JMeter的安裝配置及創建桌面快捷方式可以看我的另一篇博客&#xff0c;鏈接如下&#xff1a; 壓測…

舊手機部署輕量級服務器

將舊手機改造為Linux系統設備&#xff0c;不僅能賦予閑置設備新生&#xff0c;還能作為輕量級服務器、開發環境或學習平臺使用。以下是三種主流方案&#xff0c;涵蓋不同技術需求和安全等級&#xff0c;附操作步驟與避坑指南&#xff1a; ?? 一、三種安裝方案對比與選擇 方法…