spooky_2020
@spooky_2020
А меня Сережа зовут.

Почему БД драйвер Python MySQL Connector работает на порядок быстрее чем в других языках?

Тестировал различные технологии для автоматизации вставки данных в БД, при таких условиях:
- система хранения MyISAM
- СУБД MySQL 8/MariaDB 10.4
- Вставка 33 000 строк в 5 полей
- Код на C#/PHP/Node/Python
- запросы как подготовленные, так и обычная прямая вставка статичных значений
- запрос вида
INSERT INTO tablename (fieldA, fieldB, fieldC, fieldD, fieldE) VALUES (a, b, c, d, e)

Таблица
CREATE TABLE `zip_code` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `zip` CHAR(5) NOT NULL,
    `city` VARCHAR(50) NOT NULL,
    `stid` CHAR(2) NOT NULL,
    `state` VARCHAR(50) NOT NULL,
    PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=MyISAM
;

Результат для C#/PHP/Node - 14-15 (четырнадцать - пятнадцать) секунд.
Результат для Python - 1.5 (полторы) секунды!

Откуда такая разница в скорости вставки?
В пайтоне я использовал cursor.executemany() передавая массив с 1000 строк.
В PHP (PDO) я просмотрел все опции, но ничего для большей оптимизации там не подошло.
C#/Noda - там я использовал как указано в доках, каких то дополнительных опций я не нашел.

Какие такие особые механизмы работают в Python MySQL Connector (от Oracle) что позволяют
уделать все остальное?
Что немного обидно - ведь я так верил в PHP и компилируемый C#.
  • Вопрос задан
  • 334 просмотра
Решения вопроса 1
@galaxy
Навскидку: cursor.executemany() соединяет запросы в один большой INSERT. Остальные драйверы сами этого, видимо, не умеют.

Думаю, если вы руками соберете multi-row INSERT, то на то примерно и выйдет:
INSERT INTO tablename (fieldA, fieldB, fieldC, fieldD, fieldE)
VALUES (a, b, c, d, e),
(a1, b1, c1, d1, e1),
(a2, b2, c2, d2, e2),
...
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
index0h
@index0h
PHP, Golang. https://github.com/index0h
1k строк отдельными инсертами специалльно вставляют обычно когда производительность по важности где то в далёком и светлом будущем, либо от недостатка опыта.

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

Автор, проведите свой же тест, но с транзакцией вокруг вашей тысячи вставок, результаты будут отличаться.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы