如何计算MySQL中索引的大小


88

我想确定索引的大小,它们是主键索引。这碰巧是在mysql群集上,但我认为这并不重要。

Answers:



72

扩展了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 size_in_mb DESC;

1
为什么要按4排序?
亚历克斯

1
@Alex,因此按第4个字段(即大小)排序。即显示最大的表格,最小的最后
丹尼尔·祖哈尔

1
使用它不是更好ORDER BY size_in_mb DESC;吗?
NeverEndingQueue

1
@NeverEndingQueue有点样式问题,但我可以看到在这种情况下它将更具可读性。我已经修改了答案,现在按您的建议显示。
Daniel Zohar

42

如果使用InnoDB表,则可以从获取单个索引的大小mysql.innodb_index_stats。“ size”统计信息包含以页为单位的答案,因此您必须将其乘以page-size (默认为16K)

select database_name, table_name, index_name, stat_value*@@innodb_page_size
from mysql.innodb_index_stats where stat_name='size';

1
太棒了 正是我想要的!
Dave Martorana

3
需要说明的是:通过此查询,stat_value已经将乘以页面大小,因此该列给出了以字节为单位的索引大小。
BenediktKöppel2016年

2
谢谢,比接受的答案好得多。像我这样的其他菜鸟的注释-database_name,table_name和index_name不能用您的真实数据库名称和表名称替换;)而是应完全按原样使用该命令。
luben

在我的情况下,它给了从一个被报道的一个非常不同的(不现实)大小show table status from [dbname]
建筑学

6

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

Fill factor 通常是 2/3

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


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'

输出示例

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

问候利亚姆


我有一个特殊的情况,对于PK索引,百分比显示的值超过100,例如1844或677。我猜对于这些情况,查询存在问题。
亚历克斯·潘德里亚

2

使用phpMyAdmin,在查看表结构时,在底部某处有一个Details链接。单击它后,它将显示表上标记为“空间使用情况”的索引的总大小。

我认为它不会单独显示每个索引。


使用phpMyAdmin真的很容易。谢谢!
MrFabio '16


1

来自MySQL 5.6参考

SELECT SUM(stat_value) pages, index_name,
SUM(stat_value)*@@innodb_page_size size
FROM mysql.innodb_index_stats WHERE table_name='t1'
AND stat_name = 'size' GROUP BY index_name;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.