Mysql
如何確定 Percona MySQL 中的索引是否無用?
使用 Percona 伺服器 5.5
我有一個儲存使用者活動的表(我們稱之為 user_activity)。它是幾年前創建的,當時我對數據庫優化只有一點點了解。因此,我創建了一些索引來處理我可能遇到的不同選擇查詢。不幸的是,索引大大增加了數據的大小,現在該表是我數據庫中最大的表。正因為如此,更密集的更新查詢需要很長時間才能執行並且經常導致表鎖。
所以,我想看看我能做些什麼來從各個方面提高表的效率,並認為我應該從分析我們擁有的索引開始。不幸的是,我找不到確定是否需要索引的方法,並且對於這麼大的表,我無法刪除並重新添加,因為這可能需要數小時才能完成。
檢查是否需要或可以刪除或修改索引的最佳方法是什麼?
以下是表和索引統計資訊:
桌子:
Engine: InnoDB Row format: Compact Column count: 12 Table Rows: 764,640,132 AVG row length: 66 Data length: 47.3 GB Index length: 168.7GB max data length: 0 bytes data free: 6mb
索引:
PRIMARY BTREE (clustered) Unique: Yes Cardinality: 764634204 --------------- actions BTREE Unique: no Cardinality: 18 columns: action_type, action_id --------------- parent BTREE Unique: no Cardinality: 18 columns: section_parent_type, section_parent_id, status, added_date ---------------- Index_parent btree unique: no cardinality: 18 columns: section_parent_type,added_date,user_activity_id ---------------- Index_parent2 btree unique:no cardinality: 18 columns: section_parent_type, section_parent_id,parent_id,parent_type,status,added_date ---------------- Index_actions btree unique:no cardinality:18 columns: section_parent_type, parent_type,parent_id,action_type,added_date
列
user_activity_id - int(10), notnull, autoinc (primary) user_id - int(10), notnull added_date - datetime action_type - int(10), notnull action_id - int(10), notnull section_parent_type - int(10), notnull section_parent_id - int(10), notnull status - tinyint(3), notnull parent_type - int(10), notnull parent_id - int(10), notnull notification - tinyint(3), notnull friend_activity - tinyint(3), notnull
Percona 自己為此目的編寫了一個工具 - 它被稱為 pt-index-usage,可以在此處找到。
從描述:
該工具連接到 MySQL 數據庫伺服器,讀取查詢日誌,並使用 EXPLAIN 詢問 MySQL 它將如何使用每個查詢。完成後,它會列印出關於查詢未使用的索引的報告。
Percona 的伺服器、工具、部落格和員工是 MySQL 生態系統/社區中備受推崇的部分。