Bagaimana kueri N + 1 dapat membakar database Anda | Oleh Hernan Reese | Juni 2022

Programming

[ad_1]
Selamat datang Gaes di suratpembaca.web.id. Kali ini kita akan membahas tentang Linux yaitu Bagaimana kueri N + 1 dapat membakar database Anda | Oleh Hernan Reese | Juni 2022

.

Semoga artikel tentang Bagaimana kueri N + 1 dapat membakar database Anda | Oleh Hernan Reese | Juni 2022

dapat memberikan faedah untuk Teman-teman semua. Mari baca postingan ini
sampai selesai.

Panduan singkat untuk mengelola logika berbahaya ini

Pernahkah Anda menonton film / serial TV atau mengalami pergi ke hotel yang menyediakan layanan kamar?

Misalkan Anda pergi ke salah satu hotel ini, di mana restoran hotel berada di lantai pertama dan Anda memiliki akomodasi di lantai sepuluh. Sekarang Anda berada di sana, Anda memutuskan untuk memesan sesuatu untuk makan siang. Bayangkan sejenak Anda dialihkan ke dunia Earl yang digerakkan oleh karma.

Ini akan sangat tidak efisien karena pelayan harus banyak berlari sebelum dia bisa mendapatkan semua yang Anda inginkan. Mereka harus bolak-balik dari lantai satu hingga lantai sepuluh. ini adalah apa N+1 Masalahnya adalah Anda mendapatkan semua yang Anda minta dalam jumlah besar.

Idealnya, Anda harus membawa apa yang Anda pesan di kereta bus seperti ini, sehingga pelayan bisa membawanya sekaligus.

Pelayan dengan kereta bus

Artikel ini membahas bagaimana masalah ini muncul dalam kode dan menawarkan solusi yang dapat Anda ambil untuk mencegah masalah ini dan memastikan kinerja terbaik untuk aplikasi Anda.

Untuk menunjukkan caranya N+1 Sepertinya dalam kode Anda, saya akan membuat program konsol sederhana yang mencetak menu yang tersedia untuk dipesan dari restoran. Untuk ini, kami memiliki database dengan meals Dan drinks Meja. Pada menu, setiap makan disertai dengan minuman.

Mari kita lihat model tabel ini:

Dua kolom: Meals and Drinks Sub-Meals + ID, + Name, + Description, + drink_id (termasuk minuman) Di bawah Drinks + ID, + Name, + Description
Meja restoran

Sekarang mari kita lihat N+1 Dalam praktiknya, berikut adalah beberapa cara untuk mencari data dari database (Anda dapat menemukan kode lengkapnya di repositori saya):

Dan akhirnya, inilah metodenya dengan N+1 Masalah pertanyaan:

Ya, logika sederhana ini dapat membakar database Anda, karena Anda bolak-balik menambahkan minuman ke setiap makanan, yang tidak efisien.

Semakin banyak catatan yang Anda miliki untuk kueri atau semakin banyak pengguna yang Anda miliki, semakin banyak N+1 Masalah Kami akan mempengaruhi aplikasi Anda karena kompleksitas waktu adalah O (N) / waktu linier.

Di sini saya memberikan contoh di backend, tetapi masalah ini juga dapat ditemukan di frontend Anda, di mana alih-alih memanggil database Anda secara langsung, Anda memanggil titik akhir backend Anda pada saat yang sama Memanggil database.

Sekarang mari kita lihat dua solusi untuk masalah kita.

Bergabunglah dengan penulis dalam kueri SQL

Ini mungkin solusi yang lebih mudah. Di sini, Anda harus menulis kueri seperti berikut:

Dengan query ini, kode kita akan terlihat seperti ini:

Dengan query ini, sekarang kita hanya perlu melakukan query satu kali dari database kita dan hanya itu.

Makan makanan dan kemudian bergabung dengan minuman dengan bahasa pemrograman Anda

Tidak, kami tidak bertindak seperti contoh yang kami lihat N+1 Pertanyaan. Di sini, alih-alih menanyakan makanan dan kemudian menanyakan minuman satu per satu, kami melakukan dua kueri di database kami. Mari kita lihat caranya:

Seperti yang Anda lihat, kami hanya memiliki dua kueri di database kami: s.getMeals() Dan s.getDrinksByIDsInDan jika Anda membaca ListMenu Metode, Anda telah memperhatikan bahwa kami telah memperkenalkan dua metode lainnya. Mari kita lihat apa yang mereka lakukan dan mengapa kita membutuhkannya:

Sekarang, Anda tahu, kami tidak meminta setiap minuman dari database. Sebagai gantinya, dalam satu permintaan, kami menerima semua makanan, dan di permintaan lain, kami menanyakan minuman dan kemudian melampirkannya ke makanan yang relevan.

Kapan harus menggunakan satu solusi atau lainnya?

Nah, dalam program ini, setiap kali makan hanya berisi satu minuman, tetapi bagaimana jika satu kali makan berisi lebih dari satu minuman?

Dalam skenario itu, solusi pertama tidak dapat membantu kami, karena kueri SQL seharusnya mengulang catatan untuk setiap minuman dalam satu kali makan. Jadi, yang ingin kami lakukan adalah menggunakan opsi kedua, ketika kami pertama kali menanyakan makanan dan kemudian menerima minuman untuk menggabungkannya ke makanan masing-masing.

pengalaman pribadi

Di tempat kerja, kami memiliki layanan mikro yang bertanggung jawab untuk menyimpan banyak data tentang produk yang kami miliki dua kali sehari atau sesuai permintaan. Karena masalah ini, dibutuhkan satu menit untuk menyimpan semua data dalam cache. Setelah kami menghapus N+1Dari satu menit menjadi dua detik!

Jangan melebih-lebihkan logika sederhana seperti logika N+1. Anda dapat dengan mudah masuk ke masalah ini, tetapi Anda dapat dengan mudah menyelesaikannya. Tetapi jika Anda tidak melakukannya tepat waktu, kinerja aplikasi Anda akan memberi tahu Anda seiring waktu.

Ini yang tidak saya sebutkan N+1 Dalam ORM seperti Gorm. Saya tidak punya pengalaman dengan ini, tetapi saya sarankan jika Anda menggunakan ORM, periksa kode di bawah ini untuk melihat apakah Anda memiliki masalah ini.

CatatanCara saya menyusun kode dalam artikel ini tidak berarti bahwa ini adalah panduan tentang cara menyusun kode Anda. Berfokus pada kode masalah dan solusi dibuat sesederhana mungkin.

Jika Anda sedang mengerjakan proyek, atau memiliki proyek yang sedang berjalan, periksalah untuk menyingkirkannya N+1 Anda akan menemukan.

  1. N+1 Di Laravel: Di sini Anda dapat melihat N+1 Dalam Eloquent (sebuah ORM untuk Laravel)
  2. Figma Jam dan IconDuck: Untuk membuat gambar
  3. Repositori Artikel: Anda dapat menemukan contoh di GitHub saya

Demikian materi tentang Bagaimana kueri N + 1 dapat membakar database Anda | Oleh Hernan Reese | Juni 2022

, terimakasih telah berkunjung di website ini, mudah-mudahan postingannya ada manfaatnya ya.

[ad_2]

Source link

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan.