หากคุณส่วนใหญ่มีตาราง MyISAM คุณควรเพิ่มบัฟเฟอร์กลุ่มแทรก นี่คือสิ่งที่เอกสาร MySQL ระบุไว้ในการตั้งค่าbulk_insert_buffer_size :
MyISAM ใช้แคชที่มีลักษณะคล้ายต้นไม้เป็นพิเศษเพื่อให้แทรกจำนวนมากได้เร็วขึ้นสำหรับ INSERT ... SELECT, INSERT ... VALUES (... ), (... ), ... , ... , และโหลดข้อมูล INFILE เมื่อเพิ่มข้อมูลลงไป ตาราง ตัวแปรนี้ จำกัด ขนาดของทรีแคชเป็นไบต์ต่อเธรด การตั้งค่าเป็น 0 จะปิดใช้งานการเพิ่มประสิทธิภาพนี้ ค่าเริ่มต้นคือ 8MB
มีสองสิ่งที่คุณต้องทำ
1) เพิ่มลงใน /etc/my.cnf
[mysqld]
bulk_insert_buffer_size=512M
2) ตั้งค่าโกลบอลสำหรับมัน
SET GLOBAL bulk_insert_buffer_size = 1024 * 1024 * 512;
หากคุณไม่มีสิทธิ์ตั้งค่า bulk_insert_buffer_size ทั่วโลกให้ทำเช่นนี้
service mysql restart
แน่นอนว่านี่ไม่ใช่สำหรับ InnoDB
จากอีกมุมหนึ่งไม่ว่าตารางจะเป็น InnoDB หรือ MyISAM หากดัชนีมีขนาดใหญ่กว่าตารางคุณอาจมีดัชนีมากเกินไป ฉันมักจะแสดงความยินดีว่าการโหลด MyISAM mysqldump ควรใช้เวลา 3 ครั้งตราบเท่าที่ mysqldump ใช้ทำ ฉันยังยินดีเป็นอย่างยิ่งว่าการโหลด InnoDB mysqldump ควรใช้เวลา 4 ครั้งตราบเท่าที่ mysqldump ใช้ทำ
หากคุณมีอัตราส่วนเกินกว่า 4: 1 สำหรับการโหลด mysqldump คุณมีปัญหาอย่างใดอย่างหนึ่งจากสองข้อ:
- ดัชนีมากเกินไป
- ดัชนีใหญ่เกินไปเนื่องจากคอลัมน์ใหญ่
คุณสามารถวัดขนาดข้อมูลของคุณโดยใช้เครื่องมือจัดเก็บข้อมูลด้วยสิ่งนี้:
SELECT IFNULL(B.engine,'Total') "Storage Engine",
CONCAT(LPAD(REPLACE(FORMAT(B.DSize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Data Size", CONCAT(LPAD(REPLACE(
FORMAT(B.ISize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Index Size", CONCAT(LPAD(REPLACE(
FORMAT(B.TSize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Table Size" FROM
(SELECT engine,SUM(data_length) DSize,SUM(index_length) ISize,
SUM(data_length+index_length) TSize FROM
information_schema.tables WHERE table_schema NOT IN
('mysql','information_schema','performance_schema') AND
engine IS NOT NULL GROUP BY engine WITH ROLLUP) B,
(SELECT 3 pw) A ORDER BY TSize;
ดูว่าดัชนีนั้นใหญ่ที่สุดเท่าที่เป็นข้อมูลหรือใหญ่กว่านั้นหรือไม่
คุณอาจลองปิดใช้งานการบันทึกแบบไบนารีเช่นนี้:
echo "SET SQL_LOG_BIN=0;" > footable.sql
mysqldump --databases foo >> footable.sql
ก่อนที่จะโหลดสคริปต์อีกครั้ง