Как я могу ускорить мои вставки MySQL (InnoDB)?

У меня есть несколько файлов, которые нужно проанализировать и вставить в таблицу. Вот рассматриваемая таблица:

Как я могу ускорить мои вставки MySQL (InnoDB)?

Размер этого файла составляет 20,4 МБ, в нем 81963 строки. Есть файлы большего размера (до 40.xMB). Вот что я делаю:

self.ingester.cursor.execute('''
insert into microsoft_products (bigid_sku, md5_hexdigest, content_type, locale)
values (\'{}\', \'{}\', \'{}\', \'{}\')
'''.format(BigId_Sku, md5_hexdigest, content_type, locale))

Вот прошедшее время из нескольких строк:

line: 6400 | elapsed time: 519.91
line: 6401 | elapsed time: 519.99
line: 6402 | elapsed time: 520.07
line: 6403 | elapsed time: 520.16
line: 6404 | elapsed time: 520.24
line: 6405 | elapsed time: 520.32

После комментирования оператора вставки:

line: 6400 | elapsed time: 0.81
line: 6401 | elapsed time: 0.81
line: 6402 | elapsed time: 0.81
line: 6403 | elapsed time: 0.81
line: 6404 | elapsed time: 0.81
line: 6405 | elapsed time: 0.81

Поток управления выглядит так:

for file in files:
  open file
    for line in file:
      do stuff
      execute insert

commit

Я очень наивен, когда дело касается базы данных. Есть ли способ ускорить это?

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

ugh StackExchange 10.12.2018 19:15

У вас есть пример этого или статья, на которую вы могли бы дать мне ссылку?

Travis 10.12.2018 19:24
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В соответствии с предложением @FrankerZ вы можете вставлять партии.

При просмотре строк в файле сгенерируйте свои значения для пакетной вставки.

Пакетная вставка SQL по существу выглядит следующим образом:

INSERT INTO table (col1, col2) VALUES (r1c1, r1c2), (r2c1, r2c2)...

Где r = row и c = col.

В зависимости от количества данных, которые вы вставляете за один раз, вам может потребоваться увеличить глобальную переменную max_allowed_packet.

Вставки в базу данных обычно удобны и быстры, поэтому ваше узкое место заключается в том, что вы выполняете вставку для каждой строки, поэтому +1 для предложения @FrankerZ.

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