9
9
'query' : """
10
10
SELECT
11
11
database_name,
12
- table_name,
12
+ CASE
13
+ WHEN table_name LIKE '%#p#%' THEN SUBSTRING_INDEX(table_name, '#p#', 1)
14
+ ELSE table_name
15
+ END AS base_table_name,
13
16
index_name,
14
- stat_value * @@innodb_page_size AS index_size_bytes
17
+ SUM( stat_value * @@innodb_page_size) AS index_size_bytes
15
18
FROM
16
19
mysql.innodb_index_stats
17
20
WHERE
18
21
stat_name = 'size'
22
+ GROUP BY
23
+ database_name, base_table_name, index_name
24
+ ORDER BY
25
+ index_size_bytes DESC
26
+ LIMIT {INDEX_LIMIT}
19
27
""" .strip (),
20
28
'columns' : [
21
29
{'name' : 'db' , 'type' : 'tag' },
28
36
'name' : 'performance_schema.table_io_waits_summary_by_index_usage' ,
29
37
'query' : """
30
38
SELECT
31
- object_schema,
32
- object_name,
33
- index_name,
34
- count_read,
35
- count_update,
36
- count_delete
37
- FROM
38
- performance_schema.table_io_waits_summary_by_index_usage
39
- WHERE index_name IS NOT NULL
40
- AND object_schema NOT IN ('mysql', 'performance_schema')
39
+ t.object_schema AS schema_name,
40
+ t.object_name AS table_name,
41
+ t.index_name,
42
+ t.count_read,
43
+ t.count_update,
44
+ t.count_delete
45
+ FROM performance_schema.table_io_waits_summary_by_index_usage t
46
+ JOIN (
47
+ SELECT
48
+ database_name,
49
+ CASE
50
+ WHEN table_name LIKE '%#p#%' THEN SUBSTRING_INDEX(table_name, '#p#', 1)
51
+ ELSE table_name
52
+ END AS base_table_name,
53
+ index_name,
54
+ SUM(stat_value * @@innodb_page_size) AS index_size_bytes
55
+ FROM
56
+ mysql.innodb_index_stats
57
+ WHERE
58
+ stat_name = 'size'
59
+ GROUP BY
60
+ database_name, base_table_name, index_name
61
+ ORDER BY
62
+ index_size_bytes DESC
63
+ LIMIT {INDEX_LIMIT}
64
+ ) i ON t.object_schema = i.database_name
65
+ AND t.object_name = i.base_table_name
66
+ AND t.index_name = i.index_name
67
+ AND t.index_name IS NOT NULL
41
68
""" .strip (),
42
69
'columns' : [
43
70
{'name' : 'db' , 'type' : 'tag' },
50
77
}
51
78
52
79
DEFAULT_INDEX_METRIC_COLLECTION_INTERVAL = 300 # 5 minutes
80
+ DEFAULT_INDEX_LIMIT = 1000 # Default number of top indexes to collect
53
81
54
82
55
83
class MySqlIndexMetrics :
@@ -64,12 +92,20 @@ def include_index_metrics(self) -> bool:
64
92
def collection_interval (self ) -> int :
65
93
return int (self ._config .index_config .get ('collection_interval' , DEFAULT_INDEX_METRIC_COLLECTION_INTERVAL ))
66
94
95
+ @property
96
+ def index_limit (self ) -> int :
97
+ return int (self ._config .index_config .get ('limit' , DEFAULT_INDEX_LIMIT ))
98
+
67
99
@property
68
100
def queries (self ):
69
101
# make a copy of the query to avoid modifying the original
70
102
# in case different instances have different collection intervals
71
103
usage_query = QUERY_INDEX_USAGE .copy ()
72
104
size_query = QUERY_INDEX_SIZE .copy ()
105
+
106
+ # Update the index limit in the queries
107
+ size_query ['query' ] = size_query ['query' ].format (INDEX_LIMIT = self .index_limit )
108
+ usage_query ['query' ] = usage_query ['query' ].format (INDEX_LIMIT = self .index_limit )
73
109
usage_query ['collection_interval' ] = self .collection_interval
74
110
size_query ['collection_interval' ] = self .collection_interval
75
111
return [size_query , usage_query ]
0 commit comments