Dalam Laravel, menanyakan sejumlah besar data adalah keperluan yang sangat biasa, tetapi cara untuk menanyakan sejumlah besar data dengan cekap dan mengurangkan penggunaan memori adalah isu yang memerlukan perhatian. Artikel ini akan memperkenalkan cara melaksanakan pertanyaan data berskala besar yang cekap dalam Laravel.
Apabila menggunakan Eloquent untuk menanyakan sejumlah besar data, kami biasanya menggunakan kaedah get()
untuk mendapatkan keputusan, tetapi ini akan memuatkan semua keputusan ke dalam ingatan, menyebabkan masa yang lama Penggunaan memori yang besar. Untuk mengelakkan situasi ini, Laravel menyediakan kaedah chunk()
, yang boleh membahagikan hasil pertanyaan kepada ketulan dan memproses sebahagian daripada data pada satu masa.
DB::table('users')->orderBy('id')->chunk(200, function($users) { foreach ($users as $user) { // } });
Apabila menggunakan kaedah chunk()
, parameter pertama mewakili bilangan rekod yang diproses setiap kali, dan parameter kedua ialah fungsi panggil balik, yang boleh diproses dalam fungsi. Menggunakan kaedah chunk()
boleh mengurangkan penggunaan memori dengan berkesan, tetapi ini bukan penyelesaian yang optimum.
Pembina Pertanyaan Fasih dalam Laravel membolehkan kami mengendalikan secara terus dan mengembalikan hasil pertanyaan tanpa perlu memuatkan hasil pertanyaan ke dalam memori terlebih dahulu, jadi Kami boleh membuat pertanyaan dalam jumlah yang besar dengan cekap. data melalui pertanyaan penstriman.
DB::table('users')->where('votes', '>', 100)->orderBy('name')->cursor();
Menggunakan kaedah cursor()
boleh mengembalikan objek kursor, yang boleh dilalui menggunakan foreach
. Ini ialah cara yang cekap untuk menanyakan set data yang besar kerana ia tidak memuatkan keseluruhan hasil pertanyaan ke dalam memori, sebaliknya memuatkan dan memproses data secara berperingkat.
Sama ada anda menggunakan Eloquent atau Fluent Query Builder, menggunakan indeks boleh meningkatkan kecekapan pertanyaan. Dalam MySQL, kita boleh menggunakan index
untuk menentukan indeks yang akan digunakan.
DB::table('users')->where('name', '=', 'John')->where('age', '=', 25)->get();
Dalam contoh di atas, kita boleh menggunakan arahan index
untuk menentukan indeks.
DB::table('users')->where('name', '=', 'John')->where('age', '=', 25)->index('index_name')->get();
Gunakan arahan index
untuk menentukan indeks yang akan digunakan untuk meningkatkan kecekapan pertanyaan.
Apabila menanyakan sejumlah besar data, kami boleh menggunakan cache Redis untuk meningkatkan prestasi. Pertama, kita boleh menggunakan kaedah cache()
untuk cache hasil pertanyaan ke dalam Redis.
$users = DB::table('users')->orderBy('name')->cache('users', 10)->get();
Dalam contoh di atas, kami menggunakan kaedah cache()
untuk cache hasil pertanyaan ke dalam Redis dan menetapkan masa tamat tempoh kepada 10 minit. Dengan cara ini, kita boleh mendapatkan data terus daripada cache pada kali seterusnya kita membuat pertanyaan tanpa perlu menanya semula pangkalan data.
Apabila menggunakan Laravel untuk menanyakan set data yang besar, kita perlu mengurangkan masa pemprosesan pertanyaan sebanyak mungkin. Ini termasuk menggunakan indeks, mengoptimumkan pernyataan pertanyaan dan mengelakkan pertanyaan skop global.
$books = Book::where('category', 1)->get();
Dalam contoh di atas, kami menggunakan pertanyaan skop global untuk mendapatkan buku yang dikelaskan sebagai 1. Walaupun pertanyaan ini mudah, ia akan menanyakan keseluruhan jadual, jadi tidak disyorkan untuk menggunakannya. Sebaliknya, kita harus menganalisis pertanyaan dan mengurangkan masa pemprosesan pertanyaan sebanyak mungkin.
Ringkasnya, apabila menanyakan set data yang besar dalam Laravel, kita perlu mengoptimumkan pertanyaan dan mengurangkan penggunaan memori. Beberapa kaedah yang disediakan di atas boleh membantu kami memproses sejumlah besar data dengan cekap, tetapi situasi khusus memerlukan pemilihan kaedah yang paling sesuai berdasarkan keperluan sebenar.
Atas ialah kandungan terperinci Mari kita bincangkan tentang cara melaksanakan pertanyaan data berskala besar yang cekap dalam laravel. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!