我想弄清楚表的每个索引的大小。
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)
我怎样才能得到这些?
您应该查询以下内容:
如果该表被调用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)
试一试 !!!
请注意第一行
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)
这没有考虑 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)
| 归档时间: |
|
| 查看次数: |
12114 次 |
| 最近记录: |