Rumah > pembangunan bahagian belakang > tutorial php > Penalaan Prestasi Laravel: Mengoptimumkan Pertanyaan Pangkalan Data untuk Skala Skala

Penalaan Prestasi Laravel: Mengoptimumkan Pertanyaan Pangkalan Data untuk Skala Skala

Barbara Streisand
Lepaskan: 2025-01-30 06:04:13
asal
680 orang telah melayarinya

Laravel Performance Tuning: Optimizing Database Queries for Scalability

Dalam projek Laravel, apabila trafik meningkat, ia tidak biasa bagi pangkalan data untuk mempersembahkan kelajuan. Baru -baru ini, apabila saya mengoptimumkan hujung belakang platform hartanah, saya menghadapi masalah ini dan mempelajari beberapa pelajaran daripadanya.

Pengoptimuman pangkalan data adalah salah satu bidang utama aplikasi pembangunan dan tinggi. Ia dapat meningkatkan kelajuan pengambilan data, memendekkan masa tindak balas dan masa pemuatan halaman, dan mengurangkan beban pelayan, dan meminimumkan kos.

Cabaran platform hartanah

Bayangkan: Anda membina platform hartanah yang sangat baik yang berfungsi dengan pelbagai bandar dan dilengkapi dengan penapis carian lanjutan. Senarai hartanah dimuatkan dengan cepat, penapis carian bertindak balas dengan cepat, dan semuanya kelihatan sempurna. Walau bagaimanapun, dengan pengembangan skala aplikasi dan pertumbuhan pangkalan pengguna, pertanyaan yang telah dilakukan dengan sempurna semasa proses pembangunan telah mula melaksanakan lebih lama dan lebih lama. Adakah ia terdengar biasa?

Ini adalah apa yang ditemui oleh platform kami. Alert Sentry mempunyai pertanyaan pangkalan data yang perlahan dalam persekitaran pengeluaran, yang memberi kita amaran. Pemantauan menunjukkan bahawa pertanyaan hasil carian mengambil masa lebih dari 5 saat untuk diselesaikan -ini jauh dari pengalaman pantas yang kami janjikan!

kecacatan pertanyaan biasa (bagaimana untuk mengelakkan)

1. N 1 Soalan Pertanyaan: Musuh Rahsia Pangkalan Data

Adakah anda ingat apabila anda bermain permainan, akan mengalahkan satu musuh yang menghasilkan banyak musuh yang lebih kecil? Ini pada dasarnya sama dengan masalah pertanyaan N 1 di Laravel. Anda mendapat senarai hartanah, dan kemudian membuat pertanyaan tambahan untuk setiap harta untuk mendapatkan data yang berkaitan. Sebelum anda menyedari, pangkalan data anda berurusan dengan beratus -ratus pertanyaan, bukan hanya satu.

Berikut adalah ungkapan biasa:

<code>// 优化前
$properties = Property::all();
foreach ($properties as $property) {
    echo $property->agent->name;  // 每个房产都会触发一个新的查询
}

// 优化后
// 使用 `with()` 进行预加载
$properties = Property::with(['agent'])->get();
foreach ($properties as $property) {
    echo $property->agent->name;  // 不需要额外的查询!
}</code>
Salin selepas log masuk
Salin selepas log masuk
2. Seni indeks pangkalan data

Ia boleh membandingkan indeks pangkalan data ke indeks penulisan -mereka dapat membantu anda mencari apa yang anda inginkan tanpa mengimbas setiap halaman. Walau bagaimanapun, indeks bukan sahaja ditambah ke setiap lajur. Mari kita meneroka di -Depth.

memahami pelbagai jenis indeks

<code>// 基本的单列索引
Schema::table('properties', function (Blueprint $table) {
    $table->index('price');
});

// 多列的组合索引
Schema::table('properties', function (Blueprint $table) {
    $table->index(['city', 'price']); // 顺序很重要!
});

// 唯一索引
Schema::table('properties', function (Blueprint $table) {
    $table->unique('property_code');
});</code>
Salin selepas log masuk
Salin selepas log masuk
Amalan terbaik strategi indeks

    Urutan lajur dalam indeks gabungan adalah penting
<code>   // 良好:匹配查询模式
   $properties = Property::where('city', 'New York')
                        ->whereBetween('price', [200000, 500000])
                        ->get();

   // 索引应匹配此模式
   $table->index(['city', 'price']); // 首先是城市,然后是价格</code>
Salin selepas log masuk
Salin selepas log masuk
    indeks selektif
  1. Tidak setiap lajur memerlukan indeks. Memilih beberapa lajur untuk mengindeks beberapa lajur termasuk:

    lajur yang sering digunakan dalam klausa WHERE dan perintah oleh pernyataan

      lajur kunci luar indeks
    • Jangan indeks lajur dengan selektiviti yang rendah (seperti logo boolean)
    Penggunaan indeks pemantauan
  2. 3. Pilih kandungan yang anda perlukan, bukan semua kandungan
Salah satu kesilapan yang paling biasa yang pernah saya lihat (dan ditawarkan) adalah menggunakan pilih *secara lalai. Ini seperti pergi ke kedai runcit, tetapi membeli barang -barang dari seluruh kedai, dan anda hanya memerlukan bahan makan. Berikut adalah cara yang lebih baik:
<code>   -- 检查索引使用情况的 MySQL 查询
   SELECT
       table_name,
       index_name,
       index_type,
       stat_name,
       stat_value
   FROM mysql.index_statistics
   WHERE table_name = 'properties';</code>
Salin selepas log masuk
<code>// 优化前
$properties = Property::all();
foreach ($properties as $property) {
    echo $property->agent->name;  // 每个房产都会触发一个新的查询
}

// 优化后
// 使用 `with()` 进行预加载
$properties = Property::with(['agent'])->get();
foreach ($properties as $property) {
    echo $property->agent->name;  // 不需要额外的查询!
}</code>
Salin selepas log masuk
Salin selepas log masuk

4. Untuk segmentasi set data besar

Apabila memproses dataset besar, mengendalikan semua kandungan dalam satu operasi yang boleh mengatasi sumber sistem dan menyebabkan kesesakan. Sebaliknya, anda boleh menggunakan kaedah Chunk Laravel untuk menguruskan rekod pemprosesan batch yang boleh direkodkan:

<code>// 基本的单列索引
Schema::table('properties', function (Blueprint $table) {
    $table->index('price');
});

// 多列的组合索引
Schema::table('properties', function (Blueprint $table) {
    $table->index(['city', 'price']); // 顺序很重要!
});

// 唯一索引
Schema::table('properties', function (Blueprint $table) {
    $table->unique('property_code');
});</code>
Salin selepas log masuk
Salin selepas log masuk

5. Strategi cache yang berkesan dan berkesan

cache adalah seperti pembantu yang baik yang dapat mengingati segala -galanya. Walau bagaimanapun, seperti mana -mana pembantu, ia memerlukan arahan yang jelas.

<code>   // 良好:匹配查询模式
   $properties = Property::where('city', 'New York')
                        ->whereBetween('price', [200000, 500000])
                        ->get();

   // 索引应匹配此模式
   $table->index(['city', 'price']); // 首先是城市,然后是价格</code>
Salin selepas log masuk
Salin selepas log masuk

Petua Profesional: Jangan cache semuanya! Fokus pada: <:>

    data yang sering diakses
  • Kirakan data dengan kos tinggi
  • data yang tidak berubah dengan kerap
Amalan Terbaik

    memantau terlebih dahulu, dan kemudian mengoptimumkan
  1. Jangan masuk ke dalam perangkap pengoptimuman pramatang. Gunakan alat seperti log pertanyaan terbina Laravel atau teleskop untuk mengenal pasti hambatan sebenar. Berfikir dengan perhimpunan dan bukannya kitaran
  2. Setiap kali anda mendapati bahawa anda telah menulis gelung foreach yang menanyakan pangkalan data, sila ambil langkah mundur dan tanya jika anda boleh menggunakan pertanyaan tunggal untuk menanganinya.
  3. memanggil secara strategik Tidak semuanya perlu di -cache. Beri perhatian kepada akses yang kerap dan pertanyaan kos yang tinggi.
  4. Buat indeks Melawan indeks sebagai direktori buku -anda memerlukan butiran yang cukup untuk cepat mencari sesuatu, tetapi tidak terlalu banyak dan direktori lebih panjang daripada buku itu sendiri.
  5. kecacatan biasa yang perlu dielakkan
  6. jangan "pra -load" hubungan yang tidak perlu

Elakkan menjalankan pertanyaan dalam kitaran (perangkap masalah n 1 untuk penyamaran)

    jangan cache segala -galanya -kadang -kadang overhead pengurusan cache melebihi faedah
  • Apabila menggunakan orderby untuk lajur bukan -indeks set data besar, berhati -hati
  • jangan buat indeks untuk lajur yang jarang digunakan di mana klausa
  • Elakkan kemas kini yang kerap;
  • Kesimpulan: Ini adalah perjalanan, bukan destinasi
  • Pengoptimuman pangkalan data bukan satu tugas satu masa yang boleh dipilih dari senarai. Ia lebih seperti menjaga taman -
  • penyelenggaraan dan perhatian yang tetap untuk mendapatkan hasil terbaik
  • . Bermula dari pengetahuan asas ini, pemantauan prestasi aplikasi terus meningkatkan kaedah anda.

Ingat, matlamatnya bukan untuk mencapai setiap teknologi pengoptimuman yang anda tahu. Sebaliknya, anda mesti mencari titik keseimbangan yang sesuai untuk kes penggunaan khusus anda antara penyelenggaraan kod dan prestasi

. Kadang -kadang, pernyataan pra -beban yang mudah lebih membantu daripada menghabiskan beberapa jam untuk melakukan strategi pengoptimuman yang kompleks.

Apa yang anda hadapi dalam projek Laravel dan masalah yang anda hadapi dalam projek Laravel? Mari kita bincangkan dalam komen!

Atas ialah kandungan terperinci Penalaan Prestasi Laravel: Mengoptimumkan Pertanyaan Pangkalan Data untuk Skala Skala. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan