Pertanyaan sebenarnya adalah: Apakah catatan-catatan ini memiliki hubungan satu-ke-satu atau hubungan satu-ke-banyak ?
Jawaban TLDR:
Jika satu-ke-satu, gunakan JOIN
pernyataan.
Jika satu-ke-banyak, gunakan satu (atau banyak) SELECT
pernyataan dengan optimasi kode sisi-server.
Mengapa dan Cara Menggunakan SELECT untuk Optimasi
SELECT
(dengan beberapa kueri alih-alih bergabung) pada kelompok besar catatan berdasarkan hubungan satu-ke-banyak menghasilkan efisiensi yang optimal, karena JOIN
memiliki masalah kebocoran memori yang eksponensial. Raih semua data, lalu gunakan bahasa skrip sisi server untuk mengurutkannya:
SELECT * FROM Address WHERE Personid IN(1,2,3);
Hasil:
Address.id : 1 // First person and their address
Address.Personid : 1
Address.City : "Boston"
Address.id : 2 // First person's second address
Address.Personid : 1
Address.City : "New York"
Address.id : 3 // Second person's address
Address.Personid : 2
Address.City : "Barcelona"
Di sini, saya mendapatkan semua catatan, dalam satu pernyataan pilih. Ini lebih baik daripada JOIN
, yang akan mendapatkan sekelompok kecil catatan ini, satu per satu, sebagai sub-komponen dari permintaan lain. Lalu saya menguraikannya dengan kode sisi server yang terlihat seperti ...
<?php
foreach($addresses as $address) {
$persons[$address['Personid']]->Address[] = $address;
}
?>
Kapan Tidak Menggunakan GABUNG untuk Optimasi
JOIN
'ing sekelompok besar catatan berdasarkan pada hubungan satu-ke-satu dengan satu catatan tunggal menghasilkan efisiensi yang optimal dibandingkan dengan beberapa SELECT
pernyataan, satu demi satu, yang hanya mendapatkan jenis catatan berikutnya.
Tetapi JOIN
tidak efisien ketika mendapatkan catatan dengan hubungan satu-ke-banyak.
Contoh: Basis data Blog memiliki 3 tabel minat, Blogpost, Tag, dan Komentar.
SELECT * from BlogPost
LEFT JOIN Tag ON Tag.BlogPostid = BlogPost.id
LEFT JOIN Comment ON Comment.BlogPostid = BlogPost.id;
Jika ada 1 blogpost, 2 tag, dan 2 komentar, Anda akan mendapatkan hasil seperti:
Row1: tag1, comment1,
Row2: tag1, comment2,
Row3: tag2, comment1,
Row4: tag2, comment2,
Perhatikan bagaimana setiap rekaman digandakan. Oke, jadi, 2 komentar dan 2 tag adalah 4 baris. Bagaimana jika kita memiliki 4 komentar dan 4 tag? Anda tidak mendapatkan 8 baris - Anda mendapatkan 16 baris:
Row1: tag1, comment1,
Row2: tag1, comment2,
Row3: tag1, comment3,
Row4: tag1, comment4,
Row5: tag2, comment1,
Row6: tag2, comment2,
Row7: tag2, comment3,
Row8: tag2, comment4,
Row9: tag3, comment1,
Row10: tag3, comment2,
Row11: tag3, comment3,
Row12: tag3, comment4,
Row13: tag4, comment1,
Row14: tag4, comment2,
Row15: tag4, comment3,
Row16: tag4, comment4,
Tambahkan lebih banyak tabel, lebih banyak catatan, dll., Dan masalah akan dengan cepat mengembang ke ratusan baris yang semuanya penuh dengan sebagian besar data yang berlebihan.
Berapa biaya duplikat ini bagi Anda? Memori (di server SQL dan kode yang mencoba untuk menghapus duplikat) dan sumber daya jaringan (antara SQL server dan server kode Anda).
Sumber: https://dev.mysql.com/doc/refman/8.0/en/nested-join-optimization.html ; https://dev.mysql.com/doc/workbench/en/wb-relationship-tools.html