Який найкращий спосіб ВСТАВИТИ великий набір даних у базу даних MySQL (або будь-яку базу даних взагалі)


9

Як частина проекту PHP, я повинен вставити рядок у базу даних MySQL. Я, очевидно, звик це робити, але це вимагало введення в 90 стовпців за один запит. Отриманий запит виглядає жахливим і монолітним (особливо вставляючи мої змінні PHP як значення):

INSERT INTO mytable (column1, colum2, ..., column90) 
VALUES
('value1', 'value2', ..., 'value90')

і я стурбований тим, що я не буду про це робити правильно. Також мені знадобилося довгий (нудний) час, щоб просто набрати все, і тестування написання тестового коду буде настільки ж стомлюючим, що я боюся.

Як професіонали швидко працюють із написанням та тестуванням цих запитів? Чи є спосіб я прискорити процес?


2
Мене більше хвилює те, що таблиця містить 90 стовпців, ніж тривіальна кількість часу, витраченого на введення імен стовпців. (BTW Я перетягую всі стовпчики одразу в SQL Server, чи не існує аплетка, щоб зробити те ж саме в mySQL або PHP? Я хотів би побачити, чи зможете ви виявити, що це полегшує життя, оскільки немає помилок друку.)
HLGEM

1
Я знаю, що 90 стовпців - це багато, але кожен стовпець стосується одного поля для pdf-документа, який мені потрібно заповнити, і я не бачу сенсу його розбивати, або як би це зробити. Дякуємо за інформацію про SQL Server. Я не впевнений, що ви маєте на увазі про перетягування та скидання колонок, але я буду дивитись.
Джо

1
Напишіть заявку вибору, в якій перераховані всі стовпці даної таблиці, і перейдіть звідти.
JeffO

Джефф О: Я теж це використовував, якщо це зробити правильно, це може бути дуже потужна техніка. Ви можете опублікувати це як відповідь, якщо ви можете навести приклад коду!
FrustratedWithFormsDesigner

Відповіді:


7

Джо, твій останній коментар багато пояснив. Я думаю, що справжня проблема - це дизайн даних. Можуть знадобитися нові стовпці, коли змінюється формат документа, і, на мій досвід, формати документів, як правило, часто змінюються. Замість таблиці з 90 стовпцями, з одним рядком на звіт, я б зберігав дані звіту в таблиці з чотирма стовпцями: report_id, format_id, field_name, field_value. Кожен звіт буде представлений 90 рядками, по одному для кожного значення поля у звіті. Це має значно спростити код.


Дякуємо за Ваш відповідь. Всі поля (крім індексу) - VARCHARS, так що це могло б працювати для мене (і я міг би конвертувати інші значення в будь-якому випадку). Я можу витрачати багато місця, хоча тому, що мені доведеться розмір стовпця field_value встановити на найбільшу величину (близько 256 символів), тоді як для деяких полів потрібна лише довжина 3. Це, звичайно, буде простіше у використанні і я можу зрозуміти, як це було б більше доказом у майбутньому, як ви описали.
Джо

4
За FWIW, більшість систем баз даних використовують лише стільки місця, скільки потрібно для зберігання даних. Отже, якщо ви зберігаєте лише 3 символи в полі VARCHAR (256), це займе лише 3 байти, а не 256. Я не знаю багато про внутрішні файли MySQL, але я буду здивований, якби вони заповнили свої поля повністю оголошений розмір.
TMN

@TMN Ось що означає VAR у VARCHAR! Змінна довжина Char. Це функція (або визначення) типу даних, а не система БД. Також це не так, тому що VARCHAR є змінною довжиною, БД повинен знати довжину для кожного значення, тому він зберігає довжину як метадані. Це означає накладне зберігання! Отже, VARCHAR (1) фактично використовує 3 байти даних через накладні витрати, в 3 рази більше, ніж Char (1)!
Морон

2
-1, я не згоден з цією відповіддю. У цьому випадку вам краще 90 колонок. Якщо у суб'єкта господарювання 90 точок даних, то так і буде, зберігайте свої дані раціонально.
Морон

@TMN просто для уточнення моєї точки зору сказав: "Отже, якщо ви зберігаєте лише 3 символи в полі VARCHAR (256), це займе лише 3 байти" Правда, це займе 5 байт, а не 3.
Морони

7

Загалом, найшвидший спосіб завантаження великого набору даних у базу даних SQL - це використання власного інтерфейсу для масового завантаження. Наскільки я знаю, кожен dbms SQL має щонайменше один.

Документи MySQL: використання групового навантажувача

Якщо мені доведеться перетворити файл з обмеженими комами або комами в оператори SQL INSERT, я використовую awk, щоб прочитати вхідний файл і написати вихідний файл. Немає нічого насправді про awk; це просто трапляється мовою обробки тексту, яку я найкраще знаю. Ви можете отримати ті самі результати, написавши код у Perl, Python, Ruby, Rexx, Lisp тощо.


2
Масове завантаження - це справді шлях, якщо вам потрібно вставити велику кількість рядків, але в цьому випадку він просто вставляє один рядок з великою кількістю стовпців. Масове завантаження не допоможе, і, ймовірно, буде потрібно писати більше коду, ніж прямолінійний підхід.
TMN

-1, у цій відповіді повністю пропущено суть питання
Doc Brown

2

Якщо ви можете легко отримати імена стовпців у таблицю Excel, ви можете написати макроси Excel для створення коду для різних запитів та висловлювань DML, а потім просто вставити значення в інший стовпець, і ваш оператор вставлення / оновлення буде створений автоматично для вас. Введення вручну - це дуже повільний спосіб, тому подивіться, чи зможете ви знайти хитрощі, використовуючи наявні інструменти. Багато текстових редакторів, орієнтованих на розробників, також мають можливість записувати та зберігати макроси, щоб зробити такі повторювані завдання набагато швидшими та простішими.


2

Якщо у вас є файл csv, ви можете використовувати ІМФІЛ ЗАВАНТАЖЕННЯ ДАНИХ ... для імпорту даних.

Якщо вам доведеться використовувати "INSERT" запити, то виконання масових вставок прискорить процес. Замість запуску запиту "ВСТАВИТЬ" для кожного ряду, згрупуйте рядки, скажімо, 100 та запустіть запит. Щось на зразок цього:

INSERT INTO theTable (col1, col2, col3,....., col89, col90) 
VALUES
(val11, val12, val13, ........, val189, val190),
(val21, val22, val23, ........, val289, val290),
.......
......
(val101, val102, val103, ........, va1089, val1090);

2

Ефективним способом запису даних запитів у кілька стовпців у MySQL DB є перетворення цих даних у формат JSON або YAML та вставлення їх як єдине ціле. Це змінює "написати вставку для таблиці з 90 стовпцями" на "написати вставку в таблицю з одним стовпцем".

При такому підході не все потрібно розбити на базові компоненти, і єдиний дат зберігається просто в 1 стовпчик.


@gnat: пропонує альтернативне рішення. Це змінює "написати вставку для таблиці з 90 стовпцями" на "написати вставку в таблицю з одним стовпцем". Враховуючи описану проблему, це правильне рішення. Не все потрібно розбити на базові компоненти. Єдиний інший подібний варіант відповіді, пропонував пройти повний NoSQL, повністю виключити базу даних SQL, що є надмірним. Ця відповідь говорить про те, що ви можете використовувати змішаний підхід. Створіть лише 1 стовпець для цієї єдиної дати. Врахуйте, що альтернативою може бути наявність двійкового стовпця та збереження всього PDF-файлу.
jmoreno

@gnat: Я дам Новіффу можливість викласти це своїми словами ...
jmoreno

@ gnat та jmoreno - дякую за коментарі. Мені подобається роз'яснення моєї відповіді гнатом, і я відредагував відповідь на основі його уточнення.
Новіф

0

З MySQL ви можете використовувати альтернативний синтаксис для insertоператорів:

insert into table
        set column1 = value1
          , column2 = value2
          , column3 = value3

1
Це насправді швидше?
Pacerier

@Pacerier Ні, це не швидше. Просто ще один синтаксис.
Kaspars Foigts

0

Ваш сценарій виглядає як дуже добре підходить для рішення NoSQL, оскільки список атрибутів може змінюватися в будь-який час, коли формат змінюється. Чи оцінювали ви інші варіанти, ніж MySQL? Копати навколо DynamoDB / MongoDB / Cassandra - це може бути краще.


-1

Існує більш ефективний спосіб вставити дані в базу даних за допомогою php та mysql. Ми можемо використовувати ЗАВАНТАЖЕННЯ КОМАНДИ для вставки даних. Він вставляє дані надзвичайно швидко.

Для цього створіть плоский файл (наприклад, я використав файл .csv) зі своїми даними за допомогою fputcsv()функції. Потім вставте дані за допомогою команди LOAD. Синтаксис, що подібне, як нижче:

LOAD DATA LOCAL INFILE "C:/downloads/local/my_data_file.csv"
INTO TABLE  my_data
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES;

-1

Спробуйте наступне. Працювали для мене.

Назви форм повинні дорівнювати назви стовпців бази даних

Отримайте значення, як показано нижче:

foreach ($_GET as $formName => $value) {
    $sql = mysql_query("UPDATE table_name SET $formName = '$value' WHERE ID= $id");
}

Спочатку потрібно вставити ідентифікатор перед циклом foreach. Ви можете отримати наступний ідентифікатор, виконавши:

SELECT MAX(id) FROM .....

додати 1 до ідентифікатора та вставити його.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.