提升 MySQL 索引管理與效能優化的技巧

在處理 MySQL 資料庫性能時,索引是影響效能的重要因素之一。有效管理和排查不必要的索引,可以顯著提升資料查詢速度並降低伺服器的 I/O 負載。本文將介紹幾個提升 MySQL 索引使用效率的技巧。

1. 查找沒有主鍵的 InnoDB 表

InnoDB 引擎通常要求每個表都有一個主鍵。如果表沒有顯示的主鍵,InnoDB 會自動生成一個隱藏的聚簇索引(GEN_CLUST_INDEX),這可能會導致效能瓶頸。因此,我們可以使用以下 SQL 查找這些沒有明確主鍵的表:

SELECT t.TABLE_ID, t.NAME
FROM INFORMATION_SCHEMA.INNODB_INDEXES i
JOIN INFORMATION_SCHEMA.INNODB_TABLES t ON (i.TABLE_ID = t.TABLE_ID)
WHERE i.NAME='GEN_CLUST_INDEX';

這樣可以幫助開發者定位那些缺少主鍵的表,並進行相應的設置優化。

2. 列出未使用的索引

過多的索引可能會影響資料庫的寫入效能和 IOPS(每秒輸入輸出次數)。可以使用以下查詢,列出資料庫中未使用的索引,然後進行進一步的優化或刪除:

SELECT database_name, table_name, t1.index_name, 
       format_bytes(stat_value * @innodb_page_size) AS size
FROM mysql.innodb_index_stats t1
JOIN sys.schema_unused_indexes t2 ON 
     object_schema=database_name AND object_name=table_name 
     AND t2.index_name=t1.index_name
WHERE stat_name='size'
ORDER BY stat_value DESC;

這將幫助開發者識別那些未被使用的索引,避免無效索引帶來的效能損耗。

3. 查找缺少索引的表

除了未使用的索引,我們還需要關注那些缺少索引的表。對於那些經常進行完整表掃描(Full Table Scans)的表,適當添加索引可以顯著提升查詢效能。可以通過以下查詢來查找可能缺少索引的表:

SELECT * FROM sys.schema_tables_with_full_table_scans;

這將列出那些頻繁進行全表掃描的表,開發者可以根據結果進行分析,添加合適的索引以提升查詢速度。

結論

有效管理 MySQL 中的索引不僅可以提升查詢速度,還能減少伺服器的 I/O 負擔。通過查找沒有主鍵的表、列出未使用的索引,以及識別缺少索引的表,開發者可以有針對性地進行索引優化,提升 MySQL 的整體效能。



按讚的人:

共有 0 則留言


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