Gönderen Konu: sql optimizasyonu...  (Okunma sayısı 1285 defa)

sql optimizasyonu...

« : 30.08.2006 14:04:19 »
Hızlı düğmeleri aç

spaztica

İleti: 1.493

Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
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?

sql optimizasyonu...

« Yanıtla #1 : 30.08.2006 15:03:06 »
Hızlı düğmeleri aç

vigo


  • Ziyaretçi
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...

sql optimizasyonu...

« Yanıtla #2 : 30.08.2006 18:34:18 »
Hızlı düğmeleri aç

skate

İleti: 5.245

A Sinner Scener
Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.akaydin.com/
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.

sql optimizasyonu...

« Yanıtla #3 : 31.08.2006 00:07:23 »
Hızlı düğmeleri aç

esmaeild

İleti: 96

Çevrimdışı
  • **
  • Jr. Member
    • Profili Görüntüle
    • http://www.kodhane.com
ilişkileri çaprazlama olarak harici bir tabloda tutmak bence en iyisi. işin içine LIKE girince performans acayip düşüyor.
Coding Is Art.