Mengoptimumkan Pencapaian Rekod Terakhir dalam Hubungan Satu-dengan-Banyak Pangkalan Data
Mengambil semula rekod terbaharu untuk setiap kumpulan dalam hubungan pangkalan data satu-ke-banyak dengan cekap (cth., pelanggan dan pembelian mereka) ialah tugas manipulasi data yang biasa. Artikel ini meneroka strategi pertanyaan yang berkesan menggunakan operasi gabungan.
Pembinaan dan Penambahbaikan Pertanyaan
Pertanyaan berikut mendapatkan semula butiran pembelian terakhir untuk setiap pelanggan:
SELECT c.*, p1.* FROM customer c JOIN purchase p1 ON (c.id = p1.customer_id) LEFT OUTER JOIN purchase p2 ON (c.id = p2.customer_id AND p1.date < p2.date) WHERE p2.id IS NULL;
Pertanyaan ini menggunakan LEFT OUTER JOIN
untuk membandingkan setiap pembelian dengan pembelian lain daripada pelanggan yang sama. Fasal WHERE
menapis hasil, memastikan hanya pembelian terkini (jika tiada pembelian kemudian) disertakan.
Pengoptimuman Indeks
Untuk prestasi pertanyaan yang optimum, buat indeks kompaun pada jadual purchase
menggunakan lajur ini: (customer_id, date, id)
. Indeks penutup ini mempercepatkan operasi cantum, mengelakkan imbasan jadual tambahan.
Pertimbangan Denormalisasi: Pertukaran
Menambah lajur "last_purchase" pada jadual customer
(penyahnormalan) memudahkan pertanyaan tetapi memperkenalkan lebihan data dan kemungkinan anomali kemas kini. Pertimbangkan dengan teliti implikasi sebelum melaksanakan pendekatan ini; ia secara amnya hanya berfaedah jika pertanyaan sedemikian sangat kerap.
Pertanyaan Ringkas dengan ID Isih
Jika lajur purchase
jadual id
tersusun mengikut tarikh (menurun), pertanyaan ringkas menggunakan LIMIT
menjadi boleh dilaksanakan:
SELECT c.*, p1.* FROM customer c JOIN purchase p1 ON (c.id = p1.customer_id) WHERE p1.id = ( SELECT MAX(id) FROM purchase WHERE customer_id = c.id ) LIMIT 1;
Walau bagaimanapun, ingat bahawa ini bergantung pada pesanan konsisten lajur id
yang menggambarkan pembelian "terkini". Sebarang penyelewengan daripada pesanan ini akan menghasilkan keputusan yang salah.
Atas ialah kandungan terperinci Bagaimana untuk Mendapatkan Rekod Terakhir dengan Cekap dalam Hubungan Satu-dengan-Banyak Menggunakan Operasi Berbilang Gabungan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!