MySQL PDO создает и заполняет 1000 маленьких таблиц за 3 секунды или меньше?

Является ли это возможным? Из одного процесса? БД находится на диске SATA. Я использую Ubuntu 14.04. Все таблицы имеют 20-60 строк и 6 столбцов в каждой. Я использую транзакции.

Текущая последовательность:

  1. Создать таблицу
  2. Начать транзакцию
  3. Вставка № 1
  4. Вставка № 2
  5. ...
  6. Вставить #n
  7. совершить

Прямо сейчас я получаю около 3-4 столов в секунду.

Вывод: когда я отключил ведение журнала, моя производительность стала похожа на phpmyadmin. Так что, как предположил Рик Джеймс, я думаю, что невозможно добиться дальнейших улучшений без более быстрого хранилища.

2 ответа

Решение

На вращающемся диске вы можете получить около 100 операций в секунду. CREATE TABLE может быть медленнее, так как он включает в себя несколько файловых операций в ОС. Итак, я бы ожидал 1000 CREATE TABLEs занять более 10 секунд. Это на Ubuntu; больше на винде.

Обычно плохой дизайн схемы позволяет создавать несколько одинаковых таблиц; вместо этого имейте одну таблицу с дополнительным столбцом, чтобы различать подмножества.

INSERTing 40 тысяч строк

  • 40K однорядный INSERTs с autocommit=ON - 400 секунд.
  • 1000 многорядных INSERTs опять 20-60 рядов COMMITted после каждого высказывания - 10 секунд.
  • Один INSERT с 40К строк (если вы не выбрасываете некоторые другие ограничения) - возможно, менее чем за 1 секунду.

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

Для создания таблицы вы можете выполнить запрос с несколькими инструкциями (PDO поддерживает это), поэтому в одном запросе вы можете создать несколько таблиц и т. Для вставки вы можете использовать массовую вставку, подготавливая SQL-запрос вставки с повторным значением вставки и выполняйте как один запрос

Основная вставка основана на

INSERT INTO your_table( col1, col2,,,) 
VALUES ( val1_1, val1_2 ,,,), 
       ( vale2_1, val2_2 ,,,), 
       ....

Затем вы можете построить запрос PDO, основанный на этих методах, и выполнить тот факт, что для одного оператора, а не для каждого оператора, в качестве количества значений вы можете вставить тысячу значений в запрос и получить результат в течение нескольких секунд.

Использование многострочного синтаксиса INSERT уменьшает накладные расходы связи между клиентом и сервером, если вам нужно вставить много строк. Этот совет действителен для вставок в любую таблицу, а не только в таблицы InnoDB.

Другие вопросы по тегам