了解 MySQL 資料庫在運行中的工作負載對於效能優化至關重要。透過使用 Performance Schema 的 table_io_waits_summary_by_table 表,我們可以檢查每個表和每個資料庫模式(Schema)的讀寫操作情況,幫助識別資料庫的瓶頸。

1. 總體工作負載概覽

首先,我們可以獲取資料庫中所有表的總體讀寫次數,這能夠幫助我們快速了解資料庫的總體工作量。使用以下 SQL 查詢可以顯示讀取和寫入操作的總量,以及其比例:

SELECT 
    SUM(count_read) AS tot_reads, 
    CONCAT(ROUND((SUM(count_read)/SUM(count_star))*100, 2), "%") AS 'reads', 
    SUM(count_write) AS tot_writes, 
    CONCAT(ROUND((SUM(count_write)/SUM(count_star))*100, 2), "%") AS 'writes' 
FROM performance_schema.table_io_waits_summary_by_table 
WHERE count_star > 0;

這段查詢會顯示資料庫中執行的總讀取和總寫入次數,並計算其百分比。例如,在結果中可能會看到讀取操作佔 99.11%,而寫入操作僅佔 0.89%,這表明讀取操作是資料庫的主要工作負載。

2. 每個 Schema 的工作負載

進一步,我們可以根據不同的資料庫模式(Schema)來細分讀寫操作的情況。以下查詢會列出每個 Schema 的讀寫次數及其百分比:

SELECT object_schema, 
    CONCAT(ROUND((SUM(count_read)/SUM(count_star))*100, 2), "%") AS 'reads', 
    CONCAT(ROUND((SUM(count_write)/SUM(count_star))*100, 2), "%") AS 'writes' 
FROM performance_schema.table_io_waits_summary_by_table 
WHERE count_star > 0 
GROUP BY object_schema;

這可以幫助我們確定哪個 Schema 承擔了更多的讀取或寫入負載。通過這樣的分析,我們能夠優化資料庫結構或查詢來平衡工作負載。例如,某些 Schema 可能完全由讀取操作主導,而其他 Schema 則可能有更多的寫入操作。

3. 每個表的工作負載

除了按 Schema 進行分析,我們還可以深入到每個表的層次,檢查每個表的讀寫操作次數和比例。使用以下 SQL 查詢:

SELECT object_schema, object_name, 
    CONCAT(ROUND((count_read/count_star)*100, 2), "%") AS 'reads', 
    CONCAT(ROUND((count_write/count_star)*100, 2), "%") AS 'writes' 
FROM performance_schema.table_io_waits_summary_by_table 
WHERE count_star > 0 
AND object_schema = 'your_schema_name';

這會列出指定 Schema 中每個表的讀寫操作百分比。此分析對於檢查特定表的效能問題非常有用,例如某個表可能處理了大量寫入操作,這可能會成為效能瓶頸,從而需要優化寫入查詢或考慮分區。

結論

透過 MySQL 的 Performance Schema,我們可以詳細檢查資料庫的讀寫操作負載,無論是總體層次還是針對特定 Schema 和表。這樣的分析有助於識別資料庫中的效能瓶頸,並針對高負載的表或 Schema 進行進一步的優化。有效管理工作負載可以確保 MySQL 在高效能環境下穩定運行。



按讚的人:

共有 0 則留言


大家好,我是Hank,一名全端工程師(Full Stack Engineer),專注於網路應用程式技術,包括但不限於APP、網站及LINE官方帳號的應用。過去12年都在新創公司擔任技術長與合夥人,目前是一位自由接案者,希望拓展更多可能性。同時我也是一個樂團的鼓手,擅長打爵士鼓,如果有玩音樂的朋友,歡迎互相交流。謝謝大家!