【发布时间】:2009-04-23 14:05:17
【问题描述】:
我想确定我的索引的大小,它们是主键索引。这恰好发生在 mysql 集群上,但我认为这并不重要。
【问题讨论】:
标签: mysql
我想确定我的索引的大小,它们是主键索引。这恰好发生在 mysql 集群上,但我认为这并不重要。
【问题讨论】:
标签: mysql
我想这就是你要找的。p>
show table status from [dbname]
http://dev.mysql.com/doc/refman/5.1/en/show-table-status.html
【讨论】:
扩展 Vajk Hermecz 的答案。
这就是如何获取所有索引大小(以 MB 为单位)的方法,而无需按大小排序的 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;
【讨论】:
如果您使用 InnoDB 表,您可以从 mysql.innodb_index_stats 获取各个索引的大小。 'size' 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';
【讨论】:
stat_value 已经乘以页面大小,因此该列以字节为单位提供索引大小。
show table status from [dbname]报告的尺寸完全不同(而且不切实际)
这是对上述一些内容的改编,还可以为您提供每个索引已使用的表的总索引百分比,希望这对某人有用
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
问候 利亚姆
【讨论】:
在MyISAM 上,每个索引块都是4 KB 页面,用索引记录填充到fill_factor,每个索引记录为key length + 4 字节长。
Fill factor 通常是2/3
至于InnoDB,表总是聚集在PRIMARY KEY上,没有单独的PRIMARY KEY索引
【讨论】:
使用 phpMyAdmin,查看表格结构时,底部某处有一个详细信息链接。单击它后,它将显示您在标记为 Space Usage 的表上拥有的索引的总大小。
我认为它不会单独显示每个索引。
【讨论】:
【讨论】:
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;
【讨论】: