Назад | Перейти на главную страницу

Как рассчитать размер инстанса AWS RDS из дампа MySQL?

Мы импортируем большую историческую базу данных в RDS из mysqldump

Файл sql в формате gziped был 3 ГБ, несжатый файл sql - 18 ГБ.

Мы создали экземпляр AWS RDS объемом 30 ГБ и импортировали файл ... на экземпляре RDS закончилось место.

Мы создали экземпляр AWS RDS объемом 50 ГБ, импортировали файл ... на экземпляре RDS закончилось место.

Как рассчитать размер экземпляра AWS RDS, который мне нужен для импорта этого дампа?

Чтобы попытаться заранее ответить на любые вопросы ...

Невозможно оценить объем хранилища, требуемый для действующей базы данных, не зная ничего об используемых индексах. Каждый индекс по сути является картой, и чем больше «ключей» к карте, тем больше места для хранения требуется для этой карты.

Мощность индекса («форма» данных, по сути, количество уникальных «ключей» и способ их сопоставления со строками, содержащими этот ключ) также становится важным, если тип данных для индексированного столбца является чем-то большим, чем 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

Надеюсь, это объясняет это немного больше.