如何计算MySQL中的索引大小

时间:2009-04-23 14:05:18

标签: mysql

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

8 个答案:

答案 0 :(得分:88)

我认为这就是你要找的东西。

show table status from [dbname]

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

答案 1 :(得分:37)

扩展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;

答案 2 :(得分:31)

如果您使用的是InnoDB表,则可以从mysql.innodb_index_stats获取各个索引的大小。 '尺寸' stat包含页面中的答案,因此您必须将其乘以页面大小which is 16K by default

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

答案 3 :(得分:4)

MyISAM上,每个索引块4 KB页面填充到fill_factor,并带有索引记录,每个索引记录长key length + 4个字节。

Fill factor通常为2/3

对于InnoDB,该表始终聚集在PRIMARY KEY上,没有单独的PRIMARY KEY索引

答案 4 :(得分:2)

使用phpMyAdmin,在查看表结构时,底部有一个Details链接。单击它后,它将显示您在表中标记为Space Usage的索引的总大小。

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

答案 5 :(得分:2)

答案 6 :(得分:1)

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

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

此致 利安

答案 7 :(得分:0)

From the MySQL 5.6 reference

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;