Я борюся з масовим імпортом досить великої таблиці InnoDB, що складається приблизно з 10 мільйонів рядків (або 7 ГБ) (що для мене - найбільша таблиця, з якою я працював до цих пір).
Я провів кілька досліджень, як покращити швидкість імпорту Inno, і на даний момент моя настройка виглядає так:
/etc/mysql/my.cnf/
[...]
innodb_buffer_pool_size = 7446915072 # ~90% of memory
innodb_read_io_threads = 64
innodb_write_io_threads = 64
innodb_io_capacity = 5000
innodb_thread_concurrency=0
innodb_doublewrite = 0
innodb_log_file_size = 1G
log-bin = ""
innodb_autoinc_lock_mode = 2
innodb_flush_method = O_DIRECT
innodb_flush_log_at_trx_commit=2
innodb_buffer_pool_instances=8
import is done via bash script, here is the mysql code:
SET GLOBAL sync_binlog = 1;
SET sql_log_bin = 0;
SET FOREIGN_KEY_CHECKS = 0;
SET UNIQUE_CHECKS = 0;
SET AUTOCOMMIT = 0;
SET SESSION tx_isolation='READ-UNCOMMITTED';
LOAD DATA LOCAL INFILE '$filepath' INTO TABLE monster
COMMIT;
Дані надаються у CSV
файлі.
В даний час я тестую свої налаштування меншими "тестовими звалищами" по 2 мільйони, 3 мільйони,… рядки кожен і використовую time import_script.sh
для порівняння продуктивності.
Недолік - я отримую лише загальний час роботи, тому мені доведеться чекати повного імпорту, щоб отримати результат.
Мої результати поки:
- 10 000 рядків: <1 секунда
- 100 000 рядків: 10 секунд
- 300 000 рядків: 40 секунд
- 2 мільйони рядків: 18 хвилин
- 3 мільйони рядків: 26 хвилин
- 4 мільйони рядків: (скасовано через 2 години)
Здається, що рішення щодо «кулінарної книги» не існує, і треба самостійно придумувати оптимальне поєднання налаштувань.
Окрім пропозицій щодо того, що потрібно змінити в моїй установці, я також дуже зацікавив би додатковою інформацією про те, як я міг би краще порівняти процес імпорту / отримати більше розуміння того, що відбувається і де може бути вузьке місце.
Я спробував прочитати документацію щодо налаштувань, які я змінюю, але потім знову не знаю жодних побічних ефектів, і якщо я можу навіть знизити продуктивність із погано вибраним значенням.
На даний момент я хотів би спробувати пропозицію чату використовувати MyISAM
під час імпорту та змінити механізм таблиці.
Я хотів би спробувати це, але на даний момент для DROP TABLE
запиту потрібні години. (Що здається іншим показником, моє налаштування є менш оптимальним).
Додаткова інформація:
Машина, яку я зараз використовую, має 8 Гб оперативної пам’яті та твердотільний твердотільний накопичувач твердого тіла з 5400 об / хв.
Хоча ми також прагнемо видалити застарілі дані з відповідної таблиці, я все ще потребую дещо швидкого імпорту до
а) тесту automatic data cleanup feature
під час розробки та
б) у випадку, коли наш сервер вийде з ладу, ми хотіли б використовувати наш 2-й сервер як заміну (для чого потрібно -даточні дані, останній імпорт зайняв більше 24 годин)
mysql> SHOW CREATE TABLE monster\G
*************************** 1. row ***************************
Table: monster
Create Table: CREATE TABLE `monster` (
`monster_id` int(11) NOT NULL AUTO_INCREMENT,
`ext_monster_id` int(11) NOT NULL DEFAULT '0',
`some_id` int(11) NOT NULL DEFAULT '0',
`email` varchar(250) NOT NULL,
`name` varchar(100) NOT NULL,
`address` varchar(100) NOT NULL,
`postcode` varchar(20) NOT NULL,
`city` varchar(100) NOT NULL,
`country` int(11) NOT NULL DEFAULT '0',
`address_hash` varchar(250) NOT NULL,
`lon` float(10,6) NOT NULL,
`lat` float(10,6) NOT NULL,
`ip_address` varchar(40) NOT NULL,
`cookie` int(11) NOT NULL DEFAULT '0',
`party_id` int(11) NOT NULL,
`status` int(11) NOT NULL DEFAULT '2',
`creation_date` datetime NOT NULL,
`someflag` tinyint(1) NOT NULL DEFAULT '0',
`someflag2` tinyint(4) NOT NULL,
`upload_id` int(11) NOT NULL DEFAULT '0',
`news1` tinyint(4) NOT NULL DEFAULT '0',
`news2` tinyint(4) NOT NULL,
`someother_id` int(11) NOT NULL DEFAULT '0',
`note` varchar(2500) NOT NULL,
`referer` text NOT NULL,
`subscription` int(11) DEFAULT '0',
`hash` varchar(32) DEFAULT NULL,
`thumbs1` int(11) NOT NULL DEFAULT '0',
`thumbs2` int(11) NOT NULL DEFAULT '0',
`thumbs3` int(11) NOT NULL DEFAULT '0',
`neighbours` tinyint(4) NOT NULL DEFAULT '0',
`relevance` int(11) NOT NULL,
PRIMARY KEY (`monster_id`),
KEY `party_id` (`party_id`),
KEY `creation_date` (`creation_date`),
KEY `email` (`email`(4)),
KEY `hash` (`hash`(8)),
KEY `address_hash` (`address_hash`(8)),
KEY `thumbs3` (`thumbs3`),
KEY `ext_monster_id` (`ext_monster_id`),
KEY `status` (`status`),
KEY `note` (`note`(4)),
KEY `postcode` (`postcode`),
KEY `some_id` (`some_id`),
KEY `cookie` (`cookie`),
KEY `party_id_2` (`party_id`,`status`)
) ENGINE=InnoDB AUTO_INCREMENT=13763891 DEFAULT CHARSET=utf8
SHOW CREATE TABLE yourtable\G
щоб показати нам структуру таблиці цієї 10-мільйонної таблиці рядків.
innodb_doublewrite = 0
), ваша установка MySQL не захищена від аварій: якщо у вас відмова живлення (а не збій у MySQL), ваші дані можуть бути мовчки пошкоджені.