【问题标题】:How to figure out size of Indexes in MySQL如何计算 MySQL 中索引的大小
【发布时间】:2009-04-23 14:05:17
【问题描述】:

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

【问题讨论】:

    标签: mysql


    【解决方案1】:

    我想这就是你要找的。​​p>

    show table status from [dbname]
    

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

    【讨论】:

    • Avg_row_length、Data_length、Max_data_length、Index_length、Data_free都是以字节为单位报告的,是的。
    • 这给出了 total 索引大小,而不是每个索引的大小(假设一个表有多个索引)。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      如果您使用 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 已经乘以页面大小,因此该列以字节为单位提供索引大小。
      • 谢谢,比接受的答案好多了。像我这样的其他菜鸟的注意事项 - database_name、table_name 和 index_name 不能用您的真实数据库名称和表名替换;)而是应该完全按原样使用命令。
      • 在我的情况下,它给出的尺寸与show table status from [dbname]报告的尺寸完全不同(而且不切实际)
      【解决方案4】:

      这是对上述一些内容的改编,还可以为您提供每个索引已使用的表的总索引百分比,希望这对某人有用

      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。我猜这些情况的查询存在问题。
      【解决方案5】:

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

      Fill factor 通常是2/3

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

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

        • 使用 phpMyAdmin 真的很容易。谢谢!
        【解决方案7】:

        【讨论】:

          【解决方案8】:

          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;
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2023-03-30
            • 2022-08-12
            • 1970-01-01
            • 2010-09-09
            • 1970-01-01
            • 2010-09-15
            • 1970-01-01
            相关资源
            最近更新 更多