Мы импортируем большую историческую базу данных в RDS из mysqldump
Файл sql в формате gziped был 3 ГБ, несжатый файл sql - 18 ГБ.
Мы создали экземпляр AWS RDS объемом 30 ГБ и импортировали файл ... на экземпляре RDS закончилось место.
Мы создали экземпляр AWS RDS объемом 50 ГБ, импортировали файл ... на экземпляре 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)
Невозможно оценить объем хранилища, требуемый для действующей базы данных, не зная ничего об используемых индексах. Каждый индекс по сути является картой, и чем больше «ключей» к карте, тем больше места для хранения требуется для этой карты.
Мощность индекса («форма» данных, по сути, количество уникальных «ключей» и способ их сопоставления со строками, содержащими этот ключ) также становится важным, если тип данных для индексированного столбца является чем-то большим, чем bigint. Индексированный столбец varchar (60) с множеством уникальных комбинаций (высокая мощность) будет занимать больше места для хранения, чем столбец с низкой мощностью для того же размера таблицы, потому что ключи на карте занимают больше места для хранения, чем указатели данных в карта.
ОБНОВЛЕНИЕ: спасибо Майклу ниже, я, конечно, должен был сказать, что мое утверждение о мощности и размере хранилища зависит от механизма хранения.
Например, база данных с двумя таблицами InnoDB, обе с 2176 строками по 3 столбца и одним индексом в столбце VARCHAR (32). Единственная разница в данных для двух таблиц состоит в том, что tt1 имеет 2176 уникальных значений для столбца VARCHAR, а tt2 имеет идентичное значение для столбца VARCHAR.
Вы увидите, что размер индекса отличается примерно на 16 КБ:
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 имеет 2 компонента: словарь данных, который по умолчанию хранится в файле глобального табличного пространства, ibdata1, в каталоге данных mysql, и данные таблицы, которые хранятся в файлах .frm в подкаталоге каталога данных. .
Вот почему, Майкл, вы не видите разницы в размере хранилища файлов .frm. Если бы вы перезапустили MySQL с помощью директивы innodb_file_per_table = 1, вы бы увидели это различие, отраженное в файлах табличных пространств:
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
Надеюсь, это объясняет это немного больше.