2016-12-19 39 views
0

我有点困惑。我必须估计表格的大小以适应200万行。我不知道主要和次要索引需要多少空间。特别是对于复合主要和次要索引。该表的结构是一样的东西如何计算mysql表/数据库大小

数据库引擎:InnoDB的

create table abc(

a int, 
b varchar(30), 
c char(10), 
d bigint(8), 

FOREIGN KEY(a) 
     REFERENCES af(a_id) 
     ON DELETE RESTRICT 
     ON UPDATE RESTRICT, 
primary key(a,b,c) 
) 

CREATE UNIQUE INDEX idx_abc 
    ON abc 
    (a ASC, d ASC); 

CREATE INDEX idx_abc2 
    ON abc 
    (d); 

请帮

鲜于

+0

由于只有2万行且每行约50字节,这是不值得担心的。更重要的是,如果您放弃idx_abc2并将idx_abc更改为(d ASC,ASC) – e4c5

+0

,那只是了解尺寸部分的估计。数据将会非常大。 –

回答

0

您可以使用此查询,以显示表的大小(虽然你需要先替换变量):

SELECT 
    table_name AS `Table`, 
    round(((data_length + index_length)/1024/1024), 2) `Size in MB` 
FROM information_schema.TABLES 
WHERE table_schema = "$DB_NAME" 
    AND table_name = "$TABLE_NAME"; 

or this que RY列出每个表的大小在每个数据库中,最大的第一:

SELECT 
    table_schema as `Database`, 
    table_name AS `Table`, 
    round(((data_length + index_length)/1024/1024), 2) `Size in MB` 
FROM information_schema.TABLES 
ORDER BY (data_length + index_length) DESC; 
+0

表是空的。所以在数据进入表格之前估计大小。 –

+0

查看我的更新回答 –

0

你可以使用mysql.innodb_index_stats数据/索引的大小。 警告,大小以页面单位给出=>您必须将其乘以通常为16K的页面大小。

+0

请注意,表格是空的。我需要在插入表中的数据之前进行估计。 –

0

要做出确切的估计,您需要创建表的副本并生成2 000 000个易失性数据,表示实际大小。如其他答案中所示,测量表格以及索引,然后知道答案,您可以删除副本。

如果在您的情况下严谨性不重要,则将记录占用的字节数与记录数相乘,然后对索引执行相同操作。仅

记录* 2 000 000 +指数* 2 000 000〜= 50 * 2 000 000 + 60 * 2 000 000 = 110 * 2 000 000 = 22 000 000

+0

我不介意如果空间稍高一点。我知道,对于主索引不占用任何空间。即使它是一个复合主键也是如此吗?那么计算二级指数大小的方法是什么? –

+0

@Sunil,实际上随着表的增加,主键的大小也随之增加。当没有主键时,InnoDB创建一个隐藏的聚集索引,这就是为什么它看起来索引没有增加大小,但事实上它确实存在,但是隐藏索引补偿了它,添加了一些大小到桌子也是误导。在这里阅读更多:http://dba.stackexchange.com/questions/44520/does-the-size-of-the-primary-key-contribute-to-table-size –