PDA

View Full Version : sql optimizasyonu...


spaztica
30th August 2006, 14:04
sayısı haylice olan içerikleri keyword'lerle bağlantılandıracağım. daha önce yüzbinlerce entry içeren bir db'de (mysql) LEFT/RIGHT JOIN gibi işlemlerle her içeriğe yönelik birden fazla keyword getirme işleminde toplam row adedi fazla olduğu için yavaşlama sorunları yaşadım. bu yüzden her entry için ilgili keyword'leri ayrı table'da tutmak yerine aynı table'da ek bir field içinde virgülle ayrılmış tutmaya karar verdim. bu sayede her bir entry'ye ait keyword'ler tek basit sorguda elime geçiyor, sonra da ilgili tablodan bu keyword'lerin ne olduğuna baktırıyorum.

yani:
table1:
1,"ahmet"
2,"mehmet"
3,"veli"
4,"ali"

table2:
1,"içerik1","1,3"
2,"içerik2","2,3,4"
3,"içerik3","1,3,4"

gibi. tabii burada hangi içerikte hangi keyword ilişkili diyebilmek için sorgulamada LIKE/REGEX kullanmak gerekmeye başlıyor.

merak ettiğim şu; db düzeni açısından çok temiz olmayan bu yöntem başka yerlerde program logic'i açısından ufak tefek sorunlar yaratabilir; elde edebileceğim performans farkı buna değecek kadar olabilir mi?

vigo
30th August 2006, 15:03
regex kullan sorun olmaz... ama biliyosun db tipin farklı olmak zorunda. ama o virgüllü field yerine, ayrı bi tablo yap "left join" işini görür... sıkıntı olmaz...

skate
30th August 2006, 18:34
Ben hiçbir zaman çoklu ilişkileri tek bir alanda "1,2,6,8,21,26" şeklinde tutmayı uygun görmedim bu güne kadar. Özellikle "tüm 2'ye bağlı olanları listele" demen gerektiğinde performans kaybı çok fazla olur. Her zaman işi JOINlerle çözmek daha hızlı sonuç verecektir. Düzgün indexler ve relationlar oluşturarak kayıt sayısının artması sonucunda yaşanacak hız kaybı minimuma indirilebilir.

Bir de yine kötü ancak mümkün bir yöntem ise bir kayıdın linklenebileceği maksimum kayıt sayısını belirleyip, bu kadar alan yaratmak ve "or"larla işi çözmektir.

(filed1 = 'hede' or field2 = 'hede' ..... or field35 = 'hede') şeklinde

Gerçi performans açısından çok fazla birşey değiştirmese de kod açısından işini kolaylaştıracak bir yöntem ise virgüllerle ayrılmış alanı ayrı alanlara bölen bir sql'i yazdıktan sonra bununla bir view oluşturmak ve tablo yerine doğrudan bu view üzerinden işlemlerini yapmak olacaktır. Programın içersinde yaşanabilecek olası spagetti durumları bir nebze çözecektir.

esmaeild
31st August 2006, 00:07
ilişkileri çaprazlama olarak harici bir tabloda tutmak bence en iyisi. işin içine LIKE girince performans acayip düşüyor.