代码之家  ›  专栏  ›  技术社区  ›  Brian G

如何计算MySQL中索引的大小

  •  60
  • Brian G  · 技术社区  · 16 年前

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

    9 回复  |  直到 7 年前
        1
  •  80
  •   Emmett    11 年前

    我想这就是你要找的。

    show table status from [dbname]
    

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

        2
  •  29
  •   Daniel Zohar    9 年前

    扩展了瓦杰克赫密茨的答案。
    这就是如何获得所有索引的大小(以兆字节为单位),而不需要按大小排序的主索引(即表本身)。

    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;
    
        3
  •  26
  •   Vajk Hermecz    10 年前

    如果使用innodb表,可以从 mysql.innodb_index_stats . “大小”统计包含答案,以页为单位,因此您必须将其乘以页面大小, 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';
    
        4
  •  4
  •   Quassnoi    16 年前

    MyISAM ,每个索引块 4 KB 最多填充一页 fill_factor 有索引记录,每个 key length + 4 字节长。

    Fill factor 正常情况下 2/3

    至于 InnoDB ,表始终聚集在 PRIMARY KEY ,没有单独的 主键 指数

        5
  •  3
  •   Andrew Hare    16 年前

    我没用过,但也许 MySQL Index Analyzer 可能会有帮助。

        6
  •  2
  •   Peter D    16 年前

    使用phpmyadmin,在查看表结构时,底部某处有一个详细信息链接。一旦单击它,它将显示您在标记为空间使用的表上拥有的索引的总大小。

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

        7
  •  2
  •   Saeid    10 年前
        8
  •  0
  •   Liam Wheldon    7 年前

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

    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
    

    当做 利亚姆

        9
  •  0
  •   viggy28    7 年前

    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;