Asıl soru şu: Bu kayıtların bire bir ilişkisi veya bire çok ilişkisi var mı?
TLDR Cevabı:
Bire bir ise, JOIN ifade .
Bire çok ise, bir (veya çok) kullanın SELECT sunucu tarafı kod optimizasyonu ile deyimi .
Optimizasyon için Neden ve Nasıl Kullanılır?
SELECTBire çok ilişkiye dayanan büyük bir kayıt grubuna (birleştirme yerine birden çok sorgu ile) JOINsahip olmak, üstel bir bellek sızıntısı sorununa sahip olduğu için optimum verimlilik sağlar . Tüm verileri alın, ardından sıralamak için sunucu tarafı bir komut dosyası dili kullanın:
SELECT * FROM Address WHERE Personid IN(1,2,3);
Sonuçlar:
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"
Burada, tüm kayıtları bir select deyiminde alıyorum. Bu, JOINbu kayıtların küçük bir grubunu birer birer başka bir sorgunun alt bileşeni olarak almaktan daha iyidir . Sonra bir şey gibi görünen sunucu tarafı kodu ile ayrıştırmak ...
<?php
foreach($addresses as $address) {
$persons[$address['Personid']]->Address[] = $address;
}
?>
Optimizasyon için JOIN kullanılmadığı zaman
JOINTek bir kayıtla bire bir ilişkiye dayanan büyük bir kayıt grubunun birden fazla kayıtla karşılaştırılması, SELECT , bir sonraki kayıt türünü elde etmek için birbiri ardına ifadeye .
Fakat JOIN bire çok ilişkisiyle kayıt alırken verimsizdir.
Örnek: Blog bloglarının 3 ilgi alanı tablosu vardır: Blogpost, Etiket ve Yorum.
SELECT * from BlogPost
LEFT JOIN Tag ON Tag.BlogPostid = BlogPost.id
LEFT JOIN Comment ON Comment.BlogPostid = BlogPost.id;
1 blog yazısı, 2 etiket ve 2 yorum varsa, aşağıdaki gibi sonuçlar alırsınız:
Row1: tag1, comment1,
Row2: tag1, comment2,
Row3: tag2, comment1,
Row4: tag2, comment2,
Her kaydın nasıl kopyalandığına dikkat edin. Tamam, 2 yorum ve 2 etiket 4 satır. 4 yorumumuz ve 4 etiketimiz varsa ne olur? 8 satır almazsınız - 16 satır alırsınız:
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,
Daha fazla tablo, daha fazla kayıt vb. Ekleyin ve sorun, çoğunlukla gereksiz verilerle dolu yüzlerce satıra hızla şişer .
Bu kopyaların size maliyeti nedir? Bellek (SQL sunucusunda ve kopyaları kaldırmaya çalışan kodda) ve ağ kaynakları (SQL sunucusu ile kod sunucunuz arasında).
Kaynak: https://dev.mysql.com/doc/refman/8.0/en/nested-join-optimization.html ; https://dev.mysql.com/doc/workbench/en/wb-relationship-tools.html