Дорогие,
На самом деле, я хотел бы знать лучшее решение для управления БОЛЬШИМИ ДАННЫМИ в 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 минут), чтобы закончить
Ваши советы высоко ценятся.
Спасибо
Возможно, перед вставкой триггер выполнит какую-то работу.
Вы можете создать хэш каждой строки и сохранить вместе со строкой. Затем проверьте только строку с заданным хешем.
Например, попробуйте этот фрагмент кода
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
}
}
Работал как ОЧАРОВАНИЕ !! Спасибо за это прекрасное решение.
Просто из любопытства, сколько времени при таком подходе требуется для обработки всего файла?
это занимало около 13 минут, теперь это заняло до 2,5 минут :)
Попробуйте также добавить индекс в этот столбец, он должен ускориться: stackoverflow.com/a/3002635/562097
если вы не добавляете новую запись в тот же Excel, тогда не нужно проверять базу данных. но вы добавляете в тот же файл excel новую запись, а затем вставляете всю запись после обновления этого файла excel
Почему бы не использовать красноречивый метод laravel по умолчанию updateOrCreate
.
Надеюсь, вы уже читали об этом, если нет, вы можете прочитать об этом в документации другие методы создания.
Позвольте мне объяснить, что на самом деле он делает.
Он принимает array
значений и проверяет, что значение уже находится в базе данных, если оно уже есть в базе данных, оно обновит эти значения, а также обновит столбец updated_at
или, если его еще нет в базе данных, оно создаст новую запись в таблице.
См., например, ниже: -
policies::updateOrCreate(['value'=>1,'value'=>2,'so on...']);
и не забудьте добавить protected $fillable = [your column]
, потому что для этого используется $fillable.
Вероятно, хранить где-то хэш (как предложил Леонардо) — это выход. Возможно, Redis будет вариантом