Каков наиболее эффективный способ вставить тысячи записей в таблицу (MyS'L, Python, Django)

У меня есть таблица базы данных с уникальным полем строки и несколько цел серии полей. Строка поле, как правило, 10-100 символов в длину.

Раз в минуту или около того у меня есть следующий сценарий: я получаю список из 2-10 тысяч tuples, соответствующих записи структуры таблицы, например.

[("hello", 3, 4), ("cat", 5, 3), ...]

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

Мой код в настоящее время итерирует через этот список, для каждого tuple создает объект модуля Python с соответствующими значениями, и вызывает ".save()", что-то вроде так:

@transaction.commit_on_success
def save_data_elements(input_list):
    for (s, i1, i2) in input_list:
        entry = DataElement(string=s, number1=i1, number2=i2)
        entry.save()

Этот код в настоящее время является одним из узких мест производительности в моей системе, так что я ищу способы его оптимизации. Например, я мог бы создавать коды S'L, каждый из которых содержит команду INSERT для 100 tuples ("жесткий код" в S'L) и выполнять его, но я не знаю, улучшит ли это что-либо.

Есть ли у вас предложения по оптимизации такого процесса?

Спасибо

Ответ на: "Каков наиболее эффективный способ вставить тысячи записей в таблицу (MyS'L, Python, Django)"

Количество ответов:8

, какой формат вы получаете? если это файл, вы можете сделать какую-то навалую нагрузку: http://www.classes.cs.uchicago.edu/archive/2005/fall/23500-1/mysql-load.html

Для MyS'L конкретно, самый быстрый способ загрузки данных использует LOAD DATA INFILE, so if you could convert the data into the format that expects, it'll probably be the fastest way to get it into the table. , так что если вы могли бы преобразовать данные в формат, который ожидает, это, вероятно, будет самый быстрый способ получить его в таблицу.

"поле1", "поле2", .. а затем использовать LOAD DATA, чтобы загрузить их "--41-" Затем выполнить это:

LOAD DATA INFILE 'data.txt' INTO TABLE db2.my_table;

Reference

Вы можете написать строки в файл в формате

Если вы не LOAD DATA INFILE as some of the other suggestions mention, two things you can do to speed up your inserts are :, как некоторые другие предложения упоминания, две вещи, которые вы можете сделать, чтобы ускорить ваши вставки являются :

  1. Использование подготовленных заявлений - это вырезает накладные расходы на разбор S'L для каждой вставки
  2. Ли все ваши вставки в одной сделке - это потребует с помощью двигателя DB, который поддерживает сделки (например, Inno) "5- 5

Если вы можете сделать ручной прокат INSERT statement, then that's the way I'd go. A single заявление, то это путь я бы пойти. Одно заявление INSERT statement with multiple value clauses is much much faster than lots of individual с несколькими оговорками значения гораздо быстрее, чем много отдельных INSERT statements. заявления.

Это не связано с фактической нагрузкой данных в DB, но ...

При предоставлении "данные загружаются... Нагрузка будет сделано в ближайшее время " Тип сообщения для пользователя является вариантом, то вы можете запустить INSERTs или LOAD DATA асинхронно в другой поток.

Просто что-то еще, чтобы рассмотреть.

Независимо от метода вставки, вы хотите использовать двигатель InnoDB для максимального чтения / записи параллелизма. MyISAM будет блокировать всю таблицу на время вставки, в то время как InnoDB (в большинстве случаев) будет блокировать только затронутые строки, позволяя продолжить действия отчетов SELECT.

Я donot знаю точные детали, но вы можете использовать Json стиль представления данных и использовать его в качестве светильников или что-то. Я видел что-то подобное на Django Video Workshop Дугласа Наполеона. Смотрите видео на http://www.linux-magazine.com/online/news/django_video_workshop. and . и http://www.linux-magazine.com/online/features/django_reloaded_workshop_part_1. Hope this one helps. . Надеюсь, что это помогает.

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