Tôi đang vật lộn với việc nhập số lượng lớn một Bảng InnoDB khá lớn bao gồm khoảng 10 triệu hàng (hoặc 7 GB) (đối với tôi là bảng lớn nhất tôi từng làm việc cho đến nay).
Tôi đã thực hiện một số nghiên cứu về cách cải thiện tốc độ nhập của Inno và hiện tại thiết lập của tôi trông như thế này:
/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;
Dữ liệu được cung cấp trong một CSV
tập tin.
Hiện tại tôi đang kiểm tra cài đặt của mình với các 'bãi thử nghiệm' nhỏ hơn với 2 triệu, 3 triệu, mỗi hàng và sử dụngtime import_script.sh
để so sánh hiệu suất.
Hạn chế là tôi chỉ nhận được tổng thời gian chạy vì vậy tôi phải đợi quá trình nhập hoàn tất để có kết quả.
Kết quả của tôi cho đến nay:
- 10 000 hàng: <1 giây
- 100 000 hàng: 10 giây
- 300 000 hàng: 40 giây
- 2 triệu hàng: 18 phút
- 3 triệu hàng: 26 phút
- 4 triệu hàng: (đã hủy sau 2 giờ)
Dường như không có giải pháp 'cookbook' và người ta phải tự mình tìm ra cách pha trộn tối ưu các cài đặt.
Bên cạnh những gợi ý về những gì cần thay đổi trong thiết lập của tôi, tôi cũng thực sự đánh giá cao thông tin nhiều hơn về cách tôi có thể đánh giá tốt hơn quá trình nhập / hiểu rõ hơn những gì đang xảy ra và nơi tắc nghẽn có thể xảy ra.
Tôi đã cố gắng đọc tài liệu cho các cài đặt tôi đang thay đổi nhưng một lần nữa tôi không nhận thấy bất kỳ tác dụng phụ nào và liệu tôi có thể giảm hiệu suất với giá trị được chọn không tốt.
Hiện tại tôi muốn thử một đề xuất từ trò chuyện để sử dụng MyISAM
trong quá trình nhập và thay đổi công cụ bảng sau đó.
Tôi muốn thử điều này nhưng hiện tại DROP TABLE
truy vấn của tôi cũng mất hàng giờ để hoàn thành. (Có vẻ như một chỉ báo khác, cài đặt của tôi ít hơn thì tối ưu).
Thông tin bổ sung:
Máy tôi hiện đang sử dụng có 8GB RAM và ổ cứng Solid State Hybrid w / 5400RPM.
Mặc dù chúng tôi cũng đặt mục tiêu xóa dữ liệu lỗi thời khỏi bảng đang đề cập nhưng tôi vẫn cần nhập nhanh để
kiểm tra) automatic data cleanup feature
trong khi phát triển và
b) trong trường hợp máy chủ của chúng tôi gặp sự cố, chúng tôi muốn sử dụng máy chủ thứ 2 của mình để thay thế dữ liệu đến ngày, lần nhập gần nhất mất hơn 24 giờ)
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
để chỉ cho chúng tôi cấu trúc bảng của bảng 10 triệu hàng này.
innodb_doublewrite = 0
) cài đặt MySQL của bạn không bị sập an toàn: nếu bạn bị mất điện (không phải là sự cố MySQL), dữ liệu của bạn có thể bị hỏng âm thầm.