Mysql

如何確定 Percona MySQL 中的索引是否無用?

  • April 30, 2015

使用 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 生態系統/社區中備受推崇的部分。

引用自:https://dba.stackexchange.com/questions/99221