ฉันกำลังดิ้นรนกับการนำเข้าจำนวนมาก InnoDB- ตารางที่มีขนาดประมาณ 10 ล้านแถว (หรือ 7GB) (ซึ่งสำหรับฉันเป็นตารางที่ใหญ่ที่สุดที่ฉันเคยทำงานด้วย)
ฉันค้นคว้าวิธีปรับปรุงความเร็วการนำเข้าของ 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
แบบสอบถามของฉันก็ใช้เวลาหลายชั่วโมงกว่าจะเสร็จ (ซึ่งดูเหมือนว่าตัวบ่งชี้อื่นการตั้งค่าของฉันนั้นน้อยที่สุดแล้ว)
ข้อมูลเพิ่มเติม:
เครื่องที่ฉันใช้อยู่ในปัจจุบันมี RAM 8GB และฮาร์ดไดรฟ์ Solid State Hybrid w / 5400RPM
ในขณะที่เราตั้งเป้าหมายที่จะลบข้อมูลที่ล้าสมัยออกจากตารางในคำถามฉันยังคงต้องการนำเข้าค่อนข้างรวดเร็วใน
การทดสอบ a) automatic data cleanup feature
ขณะที่กำลังพัฒนาและ
b) ในกรณีที่เซิร์ฟเวอร์ของเราเกิดปัญหาเราต้องการใช้เซิร์ฟเวอร์ตัวที่สองของเราแทน ข้อมูลที่เป็นปัจจุบันการนำเข้าครั้งล่าสุดใช้เวลามากกว่า 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) ข้อมูลของคุณอาจเสียหายอย่างเงียบ ๆ