測試環境治理之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
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...