MySQL PDO создает и заполняет 1000 маленьких таблиц за 3 секунды или меньше?
Является ли это возможным? Из одного процесса? БД находится на диске SATA. Я использую Ubuntu 14.04. Все таблицы имеют 20-60 строк и 6 столбцов в каждой. Я использую транзакции.
Текущая последовательность:
- Создать таблицу
- Начать транзакцию
- Вставка № 1
- Вставка № 2
- ...
- Вставить #n
- совершить
Прямо сейчас я получаю около 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.