主要用到了两个表:
nformation_schema.tables
information_schema.INNODB_SYS_TABLESPACES
结合innodb_sys_tablespaces的字段FILE_SIZE计算表的物理文件大小和逻辑大小。
表的大小逻辑计算为data_length+index_length=xxx,假设是A左右,而物理文件大小是B左右,那么碎片率大约是
(B-A)/60*100%
碎片程度高的表:
下面大家也可以把基数调整的稍大一些为1.1,然后以这个为基线来做统计。
SELECT
t.table_schema,
t.table_name,
t.table_rows,
t.data_length + t.index_length data_size,
t.index_length index_size,
t.avg_row_length,
t.avg_row_length * t.table_rows logic_size,
s.FILE_SIZE,
TRUNCATE ( s.FILE_SIZE / ( t.data_length + t.index_length ) * 1.1 * 2, 0 ) tab_frag
FROM
information_schema.TABLES t,
information_schema.INNODB_SYS_TABLESPACES s
WHERE t.table_type = 'BASE TABLE' AND concat( t.table_schema, '/', t.table_name ) = s.NAME AND t.table_schema NOT IN ( 'sys', 'information_schema', 'mysql', 'test' ) AND s.FILE_SIZE > 102400000 AND ( t.data_length + t.index_length ) * 1.1 * 2 < s.FILE_SIZE ORDER BY s.FILE_SIZE;