2012-08-10 19 views
5

Potrzebuję wstawić miliony wierszy do bazy danych MySQL (silnik InnoDB). Mam problem z czasem, kiedy stoły mają duże rozmiary. Prawie cały czas poświęca się na wstawianie zapytań. Może ktoś wie, jak ją zoptymalizować?Jak zoptymalizować MySQL, aby wstawić miliony wierszy?

+0

jakie jest twoje zapytanie? –

+0

Co masz na myśli? –

+0

Wszelkie inne operacje wykonywane na stole podczas wstawiania danych? – Kermit

Odpowiedz

14

celu importowania dużą objętość danych do InnoDB:

  1. ustawiana w konfiguracji MySQL

    • innodb_doublewrite = 0
    • innodb_buffer_pool_size = 50% + pamięci systemowej
    • innodb_log_file_size = 512m
    • log-bin = 0
    • innodb_support_xa = 0
    • innodb_flush_log_at_trx_commit = 0
  2. Dodaj zaraz po rozpoczęciu transakcji:

    SET FOREIGN_KEY_CHECKS = 0;

    USTAW UNIQUE_CHECKS = 0;

    SET AUTOCOMMIT = 0;

  3. ustawiona tuż przed końcem transakcji:

    SET UNIQUE_CHECKS = 1;

    SET FOREIGN_KEY_CHECKS = 1;

+0

Te optymalizacje po prostu zabrały mi zrobienie 10.000 rekordów co 10 minut do 500 000 rekordów, imponujące. – input

+0

Ustaw również "sync_binlog = 0", jeśli jest ustawione na "1" (domyślnie "0") – zogby

+0

@zogby z loglogiem 'log_bin = 0' jest całkowicie wyłączone, więc' sync_binlog = 0' nie robi różnicy. – c2h5oh

0

Jeśli mówisz o dużej liczbie instrukcji INSERT, spójrz na coś zwane transakcjami. Jestem całkiem pewien, że większość (jeśli nie wszystkie) języki obsługują transakcje SQL. Przyspieszą wszystko, co wiąże się z pisaniem do DB. Dodatkową korzyścią jest to, że jeśli coś pójdzie nie tak, możesz wycofać zmiany.

+0

Już korzystam z transakcji :) –

Powiązane problemy