2009-09-02 7 views
2

Я пытаюсь вставить около 500 миллионов строк данных мусора в базу данных для тестирования. Прямо сейчас у меня есть PHP-скрипт, охватывающий несколько операторов SELECT/INSERT, каждый из которых находится внутри TRANSACTION - очевидно, это не лучшее решение. Столами являются InnoDB (блокировка на уровне строк).Вилка MySQL INSERT INTO (InnoDB)

Мне интересно, если я (правильно) разветвит процесс, это ускорит процесс INSERT? По курсу это займет 140 часов. Я беспокоюсь о двух вещах:

  1. Если INSERT операторы должны получить блокировку записи, то он будет оказывать разветвление бесполезно, поскольку несколько процессов не могут писать на ту же таблицу в то же время?

  2. Я использую SELECT...LAST_INSERT_ID() (внутри a TRANSACTION). Будет ли эта логика нарушаться, если в базу данных входит несколько процессов: INSERT? Я мог бы создать новое соединение с базой данных для каждой вилки, поэтому я надеюсь, что это позволит избежать проблемы.

  3. Сколько процессов я должен использовать? Сами запросы просты, и у меня есть обычный двухъядерный бокс с 2 ГБ оперативной памяти. Я установил свой InnoDB для использования 8 потоков (innodb_thread_concurrency=8), но я не уверен, должен ли я использовать 8 процессов или если это даже правильный способ подумать о совпадении.

Благодарим за помощь!

ответ

4

1) да, будет конфликт блокировок, но innodb предназначен для обработки нескольких потоков, пытающихся вставить. конечно, они не будут одновременно вставляться, но будут обрабатывать сериализацию вставок для вас. просто убедитесь, что вы специально закрываете свои транзакции, и делаете это как можно скорее. это обеспечит максимальную производительность вставки.

2) нет, эта логика не будет прерываться при условии, что у вас есть 1 соединение на поток, так как last_insert_id() является конкретным соединением.

3) это одна из тех вещей, которые вам просто нужно проверить, чтобы выяснить. На самом деле, я бы сделал программу самонастраивающейся. запустите 100 вставок с 8 потоками и запишите время выполнения. затем повторите попытку с половиной и вдвое больше. в зависимости от того, какой из них быстрее, затем сравните значения количества потоков вокруг этого числа.

В общем, вы всегда должны просто идти вперед и сравнивать этот вид вещей, чтобы увидеть, что быстрее. в течение времени, когда вам нужно подумать об этом и написать его, вы, вероятно, уже имеете предварительные номера.

+0

Спасибо за подробный ответ! Рад узнать, что не вызывает большого беспокойства. – ash

7

В документации по MySQL имеется a discussion об эффективной вставке большого количества записей. Похоже, что явным победителем является использование команды LOAD DATA INFILE, за которой следуют вставки, вставляющие несколько списков значений.

+0

Спасибо за этот совет! 20 раз быстрее, отлично. – ash