Laravel/Mysql — работа с большими данными

Дорогие,

На самом деле, я хотел бы знать лучшее решение для управления БОЛЬШИМИ ДАННЫМИ в LARAVEL/MYSQL.

В моей системе я ежедневно загружаю файл Excel (строк 5K) в свою БД на случай, если я найду ту же строку в своей таблице, чтобы не вставлять ее, и если я найду ту же строку, я изменил дату загрузки в моем ДБ.

Каждый раз, когда я загружаю Excel, я проверяю каждую строку, если она существует в моей таблице (таблица содержит> 50 КБ), с обычным массивом, как показано ниже.

           $res = policies::where('phone', '=', $row['phone'])
                      ->where('draft_no', '=', $row['draftno'])
                      ->where('due_date', '=', $duedate)
                      ->where('status', '=', $stat)
                      ->where('bord_date', '=', $borddate)
                      ->where('amount', '=', $row['amnt'])
                      ->where('remarks', '=', $row['remarks'])
                      ->exists();

                    if (!$res) { 
                   // insert row ($table->save())
                    }
                    else {
                      //update uploaded date to this row.
                    }

этот процесс занимает много времени, потому что каждый раз проверяет таблицу. Я пытался использовать array_chunk для вставки, но, тем не менее, нагрузка большая (от 15 до 20 минут), чтобы закончить

Ваши советы высоко ценятся.

Спасибо

Вероятно, хранить где-то хэш (как предложил Леонардо) — это выход. Возможно, Redis будет вариантом

Tarasovych 30.05.2019 09:34

Возможно, перед вставкой триггер выполнит какую-то работу.

Tpojka 30.05.2019 09:37
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
2
440
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы можете создать хэш каждой строки и сохранить вместе со строкой. Затем проверьте только строку с заданным хешем.

Например, попробуйте этот фрагмент кода

foreach ($rows as $row) {
    $hash = md5($row['phone'] . $row['draft_no'] . $row['due_date'] ...);
    $res = Policiess::where('hash', $hash);
    if (!$res) {
         // create a new row and store the `$hash` in `hash` column
    } else {
         //update uploaded date to this row
    }
}

Работал как ОЧАРОВАНИЕ !! Спасибо за это прекрасное решение.

Collect KASSAB 30.05.2019 10:18

Просто из любопытства, сколько времени при таком подходе требуется для обработки всего файла?

Leonardo Rossi 30.05.2019 11:27

это занимало около 13 минут, теперь это заняло до 2,5 минут :)

Collect KASSAB 30.05.2019 12:44

Попробуйте также добавить индекс в этот столбец, он должен ускориться: stackoverflow.com/a/3002635/562097

Leonardo Rossi 30.05.2019 13:05

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

Почему бы не использовать красноречивый метод laravel по умолчанию updateOrCreate. Надеюсь, вы уже читали об этом, если нет, вы можете прочитать об этом в документации другие методы создания.

Позвольте мне объяснить, что на самом деле он делает.

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

См., например, ниже: -

policies::updateOrCreate(['value'=>1,'value'=>2,'so on...']);

и не забудьте добавить protected $fillable = [your column], потому что для этого используется $fillable.

Другие вопросы по теме