我们正在从一个mysqldump导入一个大的历史数据库到RDS
gziped的sql文件是3GB,未压缩的sql文件是18GB。
我们创build了一个30GB的AWS RDS实例并导入文件… RDS实例的空间不足。
我们创build了一个50GB AWS RDS实例,导入文件… RDS实例的空间不足。
如何计算我需要导入此转储的AWS RDS实例的大小?
尝试回答任何问题…
mysql> SELECT table_schema "Database Name", sum( data_length + index_length ) / 1024 / 1024 "Database Size in MB" FROM information_schema.TABLES GROUP BY table_schema ; +--------------------+----------------------+ | Database Name | Database Size in MB | +--------------------+----------------------+ | xxxxxxxxxx | 41658.15374756 | | information_schema | 0.00976563 | | mysql | 5.96341228 | | performance_schema | 0.00000000 | +--------------------+----------------------+ 4 rows in set (28.39 sec)
在不知道使用的索引的情况下,估计实时数据库所需的存储空间是不可能的。 每个索引基本上都是一张地图,地图上的“键”越多,该地图所需的存储空间就越多。
如果索引列的数据types比bigint大,那么索引的基数(数据“形状”,本质上是唯一“键”的数目以及它们如何映射到包含该键的行)。 对于相同的表大小,具有许多独特组合(高基数)的varchar(60)的索引列将占用比具有低基数的索引列更多的存储空间,因为映射中的键占用比存储空间中的数据指针更多的存储空间地图。
更新:谢谢迈克尔下面我应该有课程说,我的主张关于基数和存储大小是依赖于存储引擎。
例如,一个包含两个InnoDB表的数据库,这两个表都包含2176行3列和一个VARCHAR(32)列上的索引。 这两个表的唯一区别在于tt1具有2176个VARCHAR列的唯一值,而tt2具有与VARCHAR列相同的值。
你会看到索引大小只有16kb左右:
mysql> select TABLE_NAME, TABLE_ROWS, DATA_LENGTH, INDEX_LENGTH from TABLES where TABLE_SCHEMA='t_idb1'; +------------+------------+-------------+--------------+ | TABLE_NAME | TABLE_ROWS | DATA_LENGTH | INDEX_LENGTH | +------------+------------+-------------+--------------+ | tt1 | 2031 | 180224 | 147456 | | tt2 | 2031 | 180224 | 131072 | +------------+------------+-------------+--------------+
请注意,InnoDB数据存储有两个组件:默认存储在mysql数据目录中的全局表空间文件ibdata1中的数据字典和存储在数据目录的子目录中的.frm文件中的表数据。
这就是为什么,迈克尔,你看到.frm文件的存储大小没有区别。 如果您要使用innodb_file_per_table = 1指令重新启动MySQL,则会在表空间文件中看到以下差异:
drwx------. 2 mysql mysql 4096 Dec 19 10:52 . drwxr-xr-x. 4 mysql mysql 4096 Dec 19 10:52 .. -rw-rw----. 1 mysql mysql 65 Dec 19 10:52 db.opt -rw-rw----. 1 mysql mysql 8610 Dec 19 10:52 tt1.frm -rw-rw----. 1 mysql mysql 393216 Dec 19 10:52 tt1.ibd -rw-rw----. 1 mysql mysql 8610 Dec 19 10:52 tt2.frm -rw-rw----. 1 mysql mysql 376832 Dec 19 10:52 tt2.ibd
InnoDB存储是独一无二的,因为表中的数据实际上是数据字典的索引,为某些操作带来了一些性能优势。 因此,基数对存储要求的影响(在这个例子中约为10%)与MyISAM大不相同:
mysql> select TABLE_NAME, TABLE_ROWS, DATA_LENGTH, INDEX_LENGTH from TABLES where TABLE_SCHEMA='t_msm'; +------------+------------+-------------+--------------+ | TABLE_NAME | TABLE_ROWS | DATA_LENGTH | INDEX_LENGTH | +------------+------------+-------------+--------------+ | tt1 | 2126 | 85040 | 87040 | | tt2 | 2126 | 85040 | 7168 | +------------+------------+-------------+--------------+ drwx------. 2 mysql mysql 4096 Dec 19 09:50 . drwxr-xr-x. 13 mysql mysql 4096 Dec 19 10:29 .. -rw-rw----. 1 mysql mysql 65 Dec 19 09:28 db.opt -rw-rw----. 1 mysql mysql 8610 Dec 19 09:31 tt1.frm -rw-rw----. 1 mysql mysql 85040 Dec 19 09:48 tt1.MYD -rw-rw----. 1 mysql mysql 87040 Dec 19 09:48 tt1.MYI -rw-rw----. 1 mysql mysql 8610 Dec 19 09:50 tt2.frm -rw-rw----. 1 mysql mysql 85040 Dec 19 09:51 tt2.MYD -rw-rw----. 1 mysql mysql 7168 Dec 19 09:51 tt2.MYI
希望这个解释多一点。