Большая таблица в mysql Обновление строк на основе CSV каждый раз - PullRequest
0 голосов
/ 05 августа 2020

У меня есть таблица с полмиллионом строк, и я предполагаю, что получаю файл CSV каждый час, когда мне нужно обновить свою таблицу MySQL на основе CSV. он может содержать новые строки или некоторые строки могут быть изменены. Таблица имеет первичный ключ (с именем SKU)

Столбцы таблицы продуктов:

  1. SKU
  2. Сведения о продукте
  3. Цена

Я хочу сделать это как можно быстрее, и одним из условий является то, что я не могу удалить таблицу и загрузить ее снова, потому что «Поддержка регулярного неблокирующего параллельного ввода данного файла в таблицу» является моим основным требованием.

Я могу использовать языки сценариев, например Python.

У меня есть решение, которое заключается в создании временной таблицы и импорте данных в таблицу, а затем обновлении моей основной таблицы.

Любая помощь или предложения приветствуются

Ответы [ 3 ]

0 голосов
/ 05 августа 2020

Если новые данные представляют собой весь набор, выполните следующие действия:

  1. CREATE TABLE new LIKE real;
  2. LOAD DATA INFILE INTO new ... Это единственный медленный шаг, но он не влияет на real таблица.
  3. Если вам нужно очистить данные, сделайте это на этом шаге. В противном случае вам не нужно Python.
  4. RENAME TABLE real TO old, new TO real; Этот шаг быстрый.
  5. DROP TABLE old;

Если входящие данные не содержат все артикулы, затем ознакомьтесь с методами здесь: http://mysql.rjweb.org/doc.php/staging_table

0 голосов
/ 06 августа 2020

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

tb_csv=file("./day_hour.csv").import@t().sort(SKU)
cs_mysql=conn_mysql.cursor("select SKU,details,Price from product order by SKU")
batch_num=10000
for 
    batch=cs_mysql.fetch(batch_num)
    new=[tb_csv,batch].merge@d(SKU)
    diff=[tb_csv,batch].merge@d(SKU,details,Price)
    modified=[diff,new].merge@d(SKU)
    save_new=file("./day_hour_new.csv").export@a(new)
    save_modified=file("./day_hour_modified.csv").export@a(modified)
    break
cs_mysql.close()
conn_mysql.update@i(file("./day_hour_new.csv").import(),product,details,Price;SKU)
conn_mysql.update@u(file("./day_hour_modified.csv").import(),product,details,Price;SKU)

Там представляет собой простое сравнение двух примеров файлов CSV, для справки http://c.raqsoft.com/article/1574665609283

0 голосов
/ 05 августа 2020

Данные, которые необходимо обновить, являются новыми или измененными. Если вы хотите быстро найти обновленные данные из базы данных и файлов CSV, исходное условие состоит в том, что оба данных должны быть в порядке. Если данные с обеих сторон в порядке, это относительно просто. В противном случае было бы полезно, если бы вы сначала отсортировали их.

Предположим, что ваши данные упорядочены по времени. Считайте почасовой CSV в память. Прочтите таблицу в базе данных пакет за пакетом и объедините две таблицы, чтобы найти обновленные данные. Однако чтение данных из базы данных происходит медленно, и их нелегко разделить для параллельной обработки. Если вы хотите быть быстрее, вы можете заранее экспортировать полные данные из базы данных в файл. Использование всех данных и ежечасного CSV-файла, чтобы найти разницу и реализовать параллельную обработку. Вы можете сделать это с помощью Python, но вы напишете больше кода, будете использовать esPro c и значительно упростите код.

...