查找 MySQL 表中每个索引的大小

Sus*_*hil 2 mysql index

我想弄清楚表的每个索引的大小。

SHOW TABLE STATUS gives "Index_length"是表中所有索引的总和。但是,如果一个表有多个索引(例如在一个员工表中),那么emp_id,ename并且deptno是 3 个不同的索引,我分别想要它们的大小。

emp_id : xx Kb  
ename  : yy Kb  
deptno : zz Kb   
Run Code Online (Sandbox Code Playgroud)

我怎样才能得到这些?

Rol*_*DBA 6

您应该查询以下内容:

如果该表被调用mydb.mytable,只需运行以下命令:

SET @PowerOfTwo = 0;
SET @GivenDB = 'mydb';
SET @GivenTB = 'mytable';
SELECT COUNT(1) INTO @MyRowCount FROM mydb.mytable;
SELECT
    index_name,SUM(column_length * @MyRowCount) indexentry_length
FROM
(
    SELECT
        index_name,column_name,
        IFNULL(character_maximum_length,
        IF(data_type='double',8,
        IF(data_type='bigint',8,
        IF(data_type='float',4,
        IF(data_type='int',4,
        IF(data_type='mediumint',3,
        IF(data_type='smallint',2,
        IF(data_type='datetime',4,
        IF(data_type='date',3,
        IF(data_type='tinyint',1,1)
        ))))))))
    ) / POWER(1024,@PowerOfTwo) column_length
FROM
(
    SELECT
        AAA.index_name,AAA.column_name,
        BBB.data_type,coalesce(AAA.sub_part,BBB.character_maximum_length) AS character_maximum_length
        FROM
        (
            SELECT table_schema,table_name,index_name,column_name,sub_part
            FROM information_schema.statistics
            WHERE table_schema = @GivenDB AND table_name = @GivenTB
        ) AAA INNER JOIN
        (
            SELECT
                table_schema,table_name,column_name,
                character_maximum_length,data_type
            FROM information_schema.columns
            WHERE table_schema = @GivenDB AND table_name = @GivenTB
        ) BBB USING (table_schema,table_name,column_name)
    ) AA
) A GROUP BY index_name;
Run Code Online (Sandbox Code Playgroud)

试一试 !!!

警告 #1

请注意第一行

SET @PowerOfTwo = 0;
Run Code Online (Sandbox Code Playgroud)

这是设置如何影响输出

0 : Bytes
1 : KiloBytes
2 : MegaBytes
3 : GigaBytes
4 : TeraBytes
Run Code Online (Sandbox Code Playgroud)

警告#2

这没有考虑 BTREE 开销和碎片。

这是其他人的另一篇文章:找出具体索引的 MySQL 索引大小

这个答案表明一个 1.4 到 2.8 的软糖因子。

因此,无论我的查询产生什么答案,将其乘以 1.4 或 2.8 以考虑 BTREE 节点和可能的碎片。在运行我的查询之前,您应该对表进行碎片整理。

如果您的表是 MyISAM:

OPTIMIZE TABLE mydb.mytable;
Run Code Online (Sandbox Code Playgroud)

如果您的表是 InnoDB:

ALTER TABLE mydb.mytable ENGINE=InnoDB;
ANALYZE TABLE mydb.mytable;
Run Code Online (Sandbox Code Playgroud)