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?
SELECT
Bire çok ilişkiye dayanan büyük bir kayıt grubuna (birleştirme yerine birden çok sorgu ile) JOIN
sahip 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, JOIN
bu 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
JOIN
Tek 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