Как часть проекта PHP, я должен вставить строку в базу данных MySQL. Я, очевидно, привык к этому, но это потребовало вставки в 90 столбцов в одном запросе. Результирующий запрос выглядит ужасно и монолитно (особенно вставляя мои PHP-переменные в качестве значений):
INSERT INTO mytable (column1, colum2, ..., column90)
VALUES
('value1', 'value2', ..., 'value90')
и я обеспокоен тем, что я не буду делать это правильно. Мне также потребовалось много (скучного) времени, чтобы набрать все, и тестирование написания тестового кода будет таким же утомительным, как я боюсь.
Как профессионалы быстро пишут и тестируют эти запросы? Есть ли способ, которым я могу ускорить процесс?
php
mysql
efficiency
Джо
источник
источник
Ответы:
Джо, твой последний комментарий многое объяснил. Я думаю, что настоящая проблема заключается в дизайне данных. Новые столбцы могут понадобиться при изменении формата документа, и в моем опыте форматы документов часто меняются. Вместо таблицы из 90 столбцов с одной строкой на отчет я бы сохранял данные отчета в таблице с четырьмя столбцами: report_id, format_id, field_name, field_value. Каждый отчет будет представлен 90 строками, по одной на каждое значение поля в отчете. Это должно значительно упростить ваш код.
источник
В общем, самый быстрый способ загрузить большой набор данных в базу данных SQL - это использовать собственный интерфейс массовой загрузки. Насколько я знаю, в каждой базе данных SQL есть хотя бы один.
Документы MySQL: использование Bulk Loader
Если мне нужно превратить файл с разделителями табуляции или запятыми в операторы SQL INSERT, я использую awk для чтения входного файла и записи выходного файла. В awk нет ничего особенного; это просто язык обработки текста, который я знаю лучше всего. Вы можете получить те же результаты, написав код на Perl, Python, Ruby, Rexx, Lisp и так далее.
источник
Если вы можете легко получить имена столбцов в электронной таблице Excel, вы можете написать макросы Excel для создания кода для различных запросов и операторов DML, а затем просто вставить значения в другой столбец, и ваш оператор вставки / обновления будет создан автоматически для вас. Вводить текст вручную - очень медленный способ, поэтому посмотрите, сможете ли вы найти хитрости с помощью существующих инструментов. Многие текстовые редакторы, ориентированные на разработчиков, также имеют возможность записывать и хранить макросы, чтобы сделать такие повторяющиеся задания намного быстрее и проще.
источник
Если у вас есть CSV-файл, вы можете использовать LOAD DATA INFILE ... для импорта данных.
Если вам нужно использовать запросы INSERT, то выполнение массовых вставок ускорит процесс. Вместо выполнения запроса INSERT для каждой отдельной строки, сгруппируйте строки, скажем, 100, и выполните запрос. Что-то вроде этого:
источник
Эффективный способ записать данные многостолбцового запроса в MySQL DB - преобразовать эти данные в формат JSON или YAML и вставить их как единое целое. Он заменяет «записать вставку для таблицы с 90 столбцами» на «записать вставку в таблицу с одним столбцом».
При таком подходе не все нужно разбивать на базовые компоненты, а один элемент данных сохраняется только в 1 столбце.
источник
С MySQL вы можете использовать альтернативный синтаксис для
insert
операторов:источник
Ваш сценарий выглядит очень хорошо подходящим для решения NoSQL, так как список атрибутов может меняться в любое время при изменении формата. Вы оценили другие варианты, чем MySQL? Копайте вокруг DynamoDB / MongoDB / Cassandra - это может быть лучше.
источник
Существует более эффективный способ вставки данных в базу данных с использованием php и mysql. Мы можем использовать LOAD COMMAND для вставки данных. Он вставляет данные на удивление быстро.
Для этого создайте плоский файл (например, я использовал файл .csv) с вашими данными, используя
fputcsv()
функцию. Затем вставьте данные с помощью команды LOAD. Синтаксис чего-то похожего как ниже:источник
Попробуйте следующее. Работал на меня.
Имена форм должны совпадать с именами столбцов базы данных
Получите значения, как показано ниже:
Сначала вам нужно будет вставить идентификатор перед циклом foreach. Вы можете получить следующий идентификатор, выполнив:
добавьте 1 к идентификатору и вставьте его.
источник