測試環境治理之MYSQL索引優化篇

来源:https://www.cnblogs.com/Jcloud/archive/2023/04/18/17328621.html
-Advertisement-
Play Games

測試環境這個話題對於開發和測試同學一定不陌生,大家幾乎每天都會接觸。但是說到對測試環境的印象,卻鮮有好評,下麵就主要給大家分享一次實際工作中的Mysql性能優化實踐,與大家共勉~ ...


作者:京東物流 李光新

1 治理背景

測試環境這個話題對於開發和測試同學一定不陌生,大家幾乎每天都會接觸。但是說到對測試環境的印象,卻鮮有好評:

•環境不穩定,測試五分鐘,排查兩小時

•基礎建設不全,導致驗證不充分,遺漏缺陷

•多人共用,節點堵塞

這些問題在行業內其實屢見不鮮,針對測試環境的治理,不得不引起我們的重視。

首先我們要清晰的認知到,測試環境管理做的不好,不光有嚴重的質量風險,還會非常影響迭代效率,所以這件事情很重要。那在解決它之前,我們首先要去想想,對於測試環境我們到底有哪些訴求?

很明顯,測試環境的定位就是滿足產研測的測試需求,保障產品迭代質量。所以從使用類型上,一般要支撐集成測試,系統測試,甚至故障測試等。

而這些環境背後,其實都伴隨著非功能性要求 ,重點體現在:

1.從使用者角度

•想用就有,不要等待

•要低維護,高穩定

1.從企業角度

•低成本,高效率

簡單總結一下,理想的測試環境應該是:自由連接、隨時可用、互訪可控。

那麼現實中的測試環境又是怎樣的呢?所謂“理想很豐滿,現實很骨感”,對於一線測試工程師可能會發現,真實的測試環境並非這麼理想。

測試同學算是測試環境的主要使用者,對測試環境的管理理應負有直接責任。不過現實中,經常看到的是,測試同學因本身測試任務較多,且測試環境管理也要求具備一定的系統運維能力,導致相對而言,測試同學要想做好測試環境管理,也不容易~

下麵就主要給大家分享一次實際工作中的Mysql性能優化實踐,與大家共勉~

問題點:物流中台運單waybill.etms應用,由於包裹表未使用索引,導致的cpu飈高問題

2 分析過程

1.不管是在日常自動化測試還是功能測試過程中,經常會遇到資料庫數據落庫比較慢的場景,不僅影響功能測試進度,還會影響自動化的執行時長和成功率,在此背景下,展開如下排查工作~

2.查詢兩個異常運單,發現數據落庫在十分鐘以上,展開分析,

3.發現都是查詢delivery_package_d拋出異常,懷疑是不是共性問題;

ybill_log.log:2022-03-17 14:42:03 ERROR com.jd.etms.waybill.worker.business.WaybillCreateFromBusiLogic handling:65 - Bus運單JDVE00001018005接貨平臺下發處理異常
waybill_log.log-org.springframework.jdbc.UncategorizedSQLException: 
waybill_log.log-### Error querying database. Cause: com.mysql.jdbc.exceptions.MySQLTimeoutException: Statement cancelled due to timeout or client request
waybill_log.log-### The error may exist in mybatis/mysql/DeliveryPackageDDao.xml
waybill_log.log-### The error may involve defaultParameterMap
waybill_log.log-### The error occurred while setting parameters
waybill_log.log-### SQL: select   package_id,package_barcode,waybill_code,vendor_barcode,good_weigth,good_volume,remark,  create_time,update_time,yn,again_weight,weigh_User_Name,weigh_Time,pack_time,again_weight_volume,package_state,data_version,flag,expected_delivered_time,packwk_no,store_id,cky2   from delivery_package_d  where waybill_code=? and yn=1
waybill_log.log-### Cause: com.mysql.jdbc.exceptions.MySQLTimeoutException: Statement cancelled due to timeout or client request
waybill_log.log-; uncategorized SQLException for SQL []; SQL state [null]; error code [0]; Statement cancelled due to timeout or client request; nested exception is com.mysql.jdbc.exceptions.MySQLTimeoutException: Statement cancelled due to timeout or client request
waybill_log.log-    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:83) ~[spring-jdbc-3.2.18.RELEASE.jar:3.2.18.RELEASE]

4.直接搜異常日誌關鍵字,“接貨平臺下發處理異常”,確認推測正確;

5.排查異常sql:

waybill_log.log-### SQL: select   package_id,package_barcode,waybill_code,vendor_barcode,good_weigth,good_volume,remark,  create_time,update_time,yn,again_weight,weigh_User_Name,weigh_Time,pack_time,again_weight_volume,package_state,data_version,flag,expected_delivered_time,packwk_no,store_id,cky2   from delivery_package_d  where waybill_code=? and yn=1
waybill_log.log-### Cause: com.mysql.jdbc.exceptions.MySQLTimeoutException: Statement cancelled due to timeout or client request

從上面sql中可以定位到,是查詢表delivery_package_d時出現了問題,而且是執行超時,不是連接超時,所以可以排除是連接的問題,與研發溝通,懷疑是索引的問題;

6.然後排查資料庫索引:

運單資料庫是分庫分表的,上述包裹表delivery_package_d有兩個表比另外兩個表,少了兩個索引,定位異常問題,然後添加索引;

ALTER TABLE waybill_0.`delivery_package_d_0` ADD INDEX `idx_package` USING BTREE(`PACKAGE_BARCODE`);
ALTER TABLE waybill_0.`delivery_package_d_0` ADD INDEX `idx_waybill_code` USING BTREE(`WAYBILL_CODE`);
ALTER TABLE waybill_0.`delivery_package_d_0` ADD INDEX `idx_waybill_code_package` USING BTREE(`WAYBILL_CODE`, `PACKAGE_BARCODE`);
ALTER TABLE waybill_0.`delivery_package_d_0` ADD PRIMARY KEY USING BTREE(`PACKAGE_ID`, `CREATE_TIME`);
ALTER TABLE waybill_0.`delivery_package_d_1` ADD INDEX `idx_waybill_code` USING BTREE(`WAYBILL_CODE`);
ALTER TABLE waybill_0.`delivery_package_d_1` ADD INDEX `idx_waybill_code_package` USING BTREE(`WAYBILL_CODE`, `PACKAGE_BARCODE`);
ALTER TABLE waybill_0.`delivery_package_d_1` ADD PRIMARY KEY USING BTREE(`PACKAGE_ID`, `CREATE_TIME`);

2.查看資料庫伺服器性能,執行前後性能對比

添加索引後,自動化執行速度和成功率也有顯著提升。

3 擴展分析

正常情況下,慢sql日誌是存儲在伺服器上的,但是也可以通過mysql設置來通過資料庫查看慢sql。

慢日誌全稱為慢查詢日誌(Slow Query Log),主要用來記錄在 MySQL 中執行時間超過指定時間的 SQL 語句。通過慢查詢日誌,可以查找出哪些語句的執行效率低,以便進行優化。

預設情況下,MySQL 並沒有開啟慢日誌,可以通過修改 slow_query_log 參數來打開慢日誌。與慢日誌相關的參數介紹如下:

slow_query_log:是否啟用慢查詢日誌,預設為0,可設置為0、1,1表示開啟。

slow_query_log_file:指定慢查詢日誌位置及名稱,預設值為host_name-slow.log,可指定絕對路徑。

long_query_time:慢查詢執行時間閾值,超過此時間會記錄,預設為10,單位為s。

log_output:慢查詢日誌輸出目標,預設為file,即輸出到文件。

log_timestamps:主要是控制 error log、slow log、genera log 日誌文件中的顯示時區,預設使用UTC時區,建議改為 SYSTEM 系統時區。

log_queries_not_using_indexes:是否記錄所有未使用索引的查詢語句,預設為off。

min_examined_row_limit:對於查詢掃描行數小於此參數的SQL,將不會記錄到慢查詢日誌中,預設為0。

log_slow_admin_statements:慢速管理語句是否寫入慢日誌中,管理語句包含 alter table、create index 等,預設為 off 即不寫入。

可以先來自定義慢sql時長,也就是語句執行超過多長時間會被定義為慢sql;

show variables like 'long_query_time' //慢sql查詢閾值設置

然後,開啟是否記錄所有未使用索引的查詢語句開關log_queries_not_using_indexes,預設為off;

SHOW variables LIKE 'log_queries_not_using_indexes' //查詢未開啟索引的開關;
set global log_queries_not_using_indexes = on //開啟索引監控開關;

上述開關開啟之後,開始分析異常日誌;

show variables like 'log_output' - log_output 預設值是FILE,是輸出在伺服器上的;
set global log_output = 'TABLE' - 設置為TABLE,可以直接從資料庫查到;

通過資料庫查詢慢sql:

select *from mysql.slow_log - 慢日誌查詢結果;

從上圖中可以很明顯的看出具體的慢sql涉及的表,及查詢時長,後面就可以針對具體的表進行針對性的優化了~

當然,在實際環境下,不建議開啟 log_queries_not_using_indexes 參數,此參數打開後可能導致慢日誌迅速增長。

所以,針對上述分析過程,各位操作完成後,可以再關閉慢日誌輸出到資料庫,之後有分析需求再開啟,這樣就會有效減少對資料庫的壓力。

4 總結

綜上,我們每個人不僅僅是測試環境的使用者,更是測試環境的建設者,每個人都需要有意識的把負責的服務測試環境穩定性提升上來,這樣整體業務的測試環境穩定性才能有保障。

而且,對於測試環境管理和維護這條路,其實是隨著解決的問題深入,需要有很深入的思考和解決問題能力,隨之,對技術的要求也越來越高,當然,這也正是我們的價值所在。

以上,與君共勉~


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、redis主從複製 主從複製:是存儲數據的服務結構 主伺服器:接受客戶端連接的伺服器 從伺服器:自動與主伺服器保持數據一致的伺服器 配置主從複製 1、環境準備 主伺服器 主機名:master IP地址:192.168.11.101/24 從伺服器 主機名:node01 IP地址:192.168. ...
  • 4月22日周六下午14:00,雲資料庫技術主辦的「MySQL x ClickHouse」技術沙龍,將在杭州市海智中心3號樓1102報告廳舉辦。本次沙龍以“技術進化,讓數據更智能”為主題,匯聚位元組跳動、阿裡雲、玖章算術、華為雲、騰訊雲、百度等眾多資料庫廠商的技術大咖, 圍繞 MySQL x Click... ...
  • 摘要:100%全量通過!基於全棧創新計算架構的全密態資料庫華為雲GaussDB,完成了中國信通院組織的首批“全密態資料庫”產品能力評測。 本文分享自華為雲社區《全量通過!華為雲GaussDB首批完成信通院全密態資料庫評測》,作者: GaussDB 資料庫。 100%全量通過!基於全棧創新計算架構的全 ...
  • Linux操作系統的網路模塊是負責網路通信的核心部分。它通過實現各種協議和演算法,使得電腦能夠在網路中進行數據交換和通信。網路模塊主要包括以下幾個方面的功能: (1)IP協議棧:負責處理網路層的數據包,實現IP地址的分配、路由選擇等功能。 IP協議棧是網路模塊中最基本的部分,它負責處理網路層的數據包 ...
  • 在某些特殊情況下,需要修改當前Oracle資料庫實例中的ORACLE_SID。下麵簡單的總結一下如何修改$ORACLE_SID的步驟。預設情況下,INSTANCE_NAME參數和ORACLE_SID的值是相同的,但是它們也可以不同。另外,如果參數文件(pfile或spfile)中沒有指定instan ...
  • 一、配置哨兵服務 1、哨兵服務介紹 監視 master 伺服器,發現 master 宕機後,將 slave 伺服器提升為 master 伺服器 主配置文件:sentinel.conf 模板文件:redis-4.0.8/sentinel.conf 哨兵服務:類似於mha的管理節點,會監視 master ...
  • 大家好啊,最近在學redis,在虛擬機上安裝花了不少時間,於是整理了一下詳細的安裝教程,有需要的小伙伴可以看看,避免踩坑! 安裝redis時虛擬機的前置條件 我用的是centos7.6,這裡預設大家都安好虛擬機了,如果沒有安裝的同學可以看我下一篇的博客 🚀 下載redis的壓縮包 Index of ...
  • 1. Docker簡單介紹 1.1. 什麼是docker? 1.2. Docker和傳統虛擬機 1.3. 為什麼使用docker 1.4. docker架構 2. Docker安裝 2.1. docker版本命名 2.2. docker安裝 2.3. docker卸載 2.4. docker鏡像加速 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...