Что является самым эффективным способом вставить тысячи записей в таблицу (MySQL, Python, Django)

Скорее всего, вы захотите упаковать код в определенную функцию инициализации. Поскольку (std::) массивы различной длины на самом деле являются разными типами, тем не менее, вам либо нужна функция шаблона, либо вам нужно работать с внутренними необработанными массивами (data()):

template <typename T>
void initialize(T& t)
{
    for(auto& a : t)
    //      ^ reference to pointer (!)
    {
        a = new A();
        a->foo();
    }
    std::cout << std::endl;
}

Затем просто вызовите эту функцию для каждого массива. Если это все еще не достаточно коротко, вы можете упаковать это в шаблонную функцию:

template <typename T, typename ... TT>
void initialize(T& t, TT& ... tt)
{
    initialize(t);
    initialize(tt...);
}

// alternatively, a bit shorter, with C++17 fold expression:
template <typename ... TT>
void initialize(TT& ... tt)
{
    (initialize(tt), ...);
}

В точке вызова это, скорее всего, будет самое короткое время, которое вы можете получить (кроме выбора еще более короткого имени ):

initialize(array1, array2, array3, array4, ...);
11
задан Roee Adler 12 May 2009 в 06:48
поделиться

8 ответов

Вы можете записать строки в файл в формате "field1", "field2", .., а затем используйте ЗАГРУЗИТЬ ДАННЫЕ для их загрузки

data = '\n'.join(','.join('"%s"' % field for field in row) for row in data)
f= open('data.txt', 'w')
f.write(data)
f.close()

Затем выполните следующее:

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

Ссылка

11
ответ дан 3 December 2019 в 01:53
поделиться

В частности, для MySQL самым быстрым способом загрузки данных является использование ЗАГРУЗИТЬ ИНФИЛЬ ДАННЫХ , поэтому, если вы можете преобразовать данные в ожидаемый формат, это, вероятно, будет самый быстрый способ поместить его в таблицу.

12
ответ дан 3 December 2019 в 01:53
поделиться

Если вы не LOAD DATA INFILE , как упоминается в некоторых других предложениях, вы можете сделать две вещи, чтобы ускорить вставку:

  1. Используйте подготовленные операторы - это сокращает накладные расходы на синтаксический анализ SQL для каждой вставки
  2. Выполняйте все ваши вставки в одной транзакции - это потребует использования механизма БД, поддерживающего транзакции (например, InnoDB)
4
ответ дан 3 December 2019 в 01:53
поделиться

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

4
ответ дан 3 December 2019 в 01:53
поделиться

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

2
ответ дан 3 December 2019 в 01:53
поделиться

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

1
ответ дан 3 December 2019 в 01:53
поделиться

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

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

1
ответ дан 3 December 2019 в 01:53
поделиться

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

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

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

1
ответ дан 3 December 2019 в 01:53
поделиться
Другие вопросы по тегам:

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