如何计算MySQL中索引的大小

xfb7svmp  于 2023-01-29  发布在  Mysql
关注(0)|答案(9)|浏览(111)

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

jyztefdp

jyztefdp1#

我想这就是你要找的。

show table status from [dbname]

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

kyks70gy

kyks70gy2#

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

h7appiyu3#

如果你使用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';
ykejflvf

ykejflvf4#

下面是对上面一些方法的修改,它还为您提供了每个索引所使用的表的总索引的百分比,希望这对某些人有用

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

问候利亚姆

ecr0jaav

ecr0jaav5#

MyISAM上,每个索引块是4 KB页,用索引记录填充到fill_factor,每个索引块的长度为key length + 4字节。
Fill factor通常为2/3
对于InnoDB,表总是聚集在PRIMARY KEY上,没有单独的PRIMARY KEY索引

iqih9akk

iqih9akk6#

使用phpMyAdmin,当你查看表格结构时,在底部某处有一个Details链接,一旦你点击它,它会显示你在标有Space Usage的表格中所拥有的索引的总大小。
我不认为它会单独显示每个索引。

ghhaqwfi

ghhaqwfi8#

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;
tag5nh1u

tag5nh1u9#

如果只想知道现有索引需要多少空间每行,可以查看EXPLAIN命令的key_len输出,其中显示了索引大小(以字节为单位):

EXPLAIN SELECT * FROM table_name WHERE column_1 = A AND column_2 = B;

如果查询将返回至少1行,则这将显示(column_1, column_2)上索引的大小。您可以验证在输出的key列中使用了正确的索引。

相关问题