Якщо у вас в основному є таблиці MyISAM, вам слід збільшити буфер масової вставки . Ось що говорить документація MySQL про налаштування bulk_insert_buffer_size :
MyISAM використовує спеціальний кешоподібний кеш для того, щоб зробити масові вставки швидшими для INSERT ... SELECT, INSERT ... VALUES (...), (...), ..., and LOAD DATA INFILE при додаванні даних до непустих столи. Ця змінна обмежує розмір дерева кеша в байтах на потік. Встановлення його на 0 відключає цю оптимізацію. Значення за замовчуванням - 8 МБ.
Вам потрібно зробити дві речі
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. Я також підрахував, що перезавантаження mysqldump InnoDB повинно зайняти 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
перед перезавантаженням сценарію