如何计算MySQL中的索引大小

Bri*_*n G 72 mysql

我想确定索引的大小,它们是主键索引.这恰好在mysql集群上,但我不认为这很重要.

小智 89

我想这就是你要找的东西.

show table status from [dbname]
Run Code Online (Sandbox Code Playgroud)

http://dev.mysql.com/doc/refman/5.1/en/show-table-status.html

  • 这给出了*total*index大小,而不是每个索引的大小(假设一个表有多个索引). (14认同)
  • 此命令是否以字节报告data_length? (3认同)
  • Avg_row_length,Data_length,Max_data_length,Index_length,Data_free都以字节为单位报告,是的. (2认同)

Dan*_*har 44

扩展Vajk Hermecz的答案.
这是如何在没有PRIMARY(表本身)的情况下获得所有索引大小(以兆字节为单位),按大小排序.

SELECT database_name, table_name, index_name, 
round(stat_value*@@innodb_page_size/1024/1024, 2) size_in_mb
FROM mysql.innodb_index_stats
WHERE stat_name = 'size' AND index_name != 'PRIMARY'
ORDER BY 4 DESC;
Run Code Online (Sandbox Code Playgroud)


Vaj*_*ecz 32

如果您使用的是InnoDB表,则可以从中获取各个索引的大小mysql.innodb_index_stats.'size'统计信息包含页面中的答案,因此您必须将其乘以页面大小,默认情况下为16K.

select database_name, table_name, index_name, stat_value*@@innodb_page_size
from mysql.innodb_index_stats where stat_name='size';
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,比接受的答案要好得多。给像我这样的其他菜鸟的注意事项 - database_name、table_name 和 index_name 不会被替换为您的真实数据库名称和表名;) 相反,该命令应完全按原样使用。 (3认同)
  • 需要说明的是:通过此查询,“ stat_value”已经乘以页面大小,因此该列给出了以字节为单位的索引大小。 (2认同)

Lia*_*don 6

这是对上述一些内容的改编,还可以为您提供每个索引使用的表的总索引百分比,希望这对某人有用

select 
    database_name, 
    table_name, 
    index_name, 
    round((stat_value*@@innodb_page_size)/1024/1024, 2) SizeMB, 
    round(((100/(SELECT INDEX_LENGTH FROM INFORMATION_SCHEMA.TABLES t WHERE t.TABLE_NAME = iis.table_name and t.TABLE_SCHEMA = iis.database_name))*(stat_value*@@innodb_page_size)), 2) `Percentage`
from mysql.innodb_index_stats iis 
where stat_name='size' 
and table_name = 'TargetTable'
and database_name = 'targetDB'
Run Code Online (Sandbox Code Playgroud)

示例输出

database_name   table_name  index_name  SizeMB  Percentage
targetDB        TargetTable id          10      55.55
targetDB        TargetTable idLookup    5       27.77
targetDB        TargetTable idTest      3       16.66
Run Code Online (Sandbox Code Playgroud)

问候利亚姆


Qua*_*noi 5

在上MyISAM,每个索引块的4 KB页面填充fill_factor索引记录,每个索引记录为key length + 4字节长。

Fill factor 通常是 2/3

至于InnoDB表总是聚集在上PRIMARY KEY,没有单独的PRIMARY KEY索引