• 11-04-2009, 12:21:04
    #1
    Üyeliği durduruldu
    Merhaba Arkadaşlar

    Id int(9)
    fname varchar(75) utf8_general_ci
    name varchar(250) utf8_general_ci
    street varchar(40) utf8_general_ci
    nr varchar(34) utf8_general_ci
    zip varchar(13) utf8_general_ci
    city varchar(45) utf8_general_ci
    tel varchar(22) utf8_general_ci

    Elimde 20 milyon kayıt içeren isim,soyisim,adres,postak,şehir,tel alanlarından oluşan bir tablo var
    eşleştirmeler ile veri kontrolu yapıyorum bunun içinde tam eşleşmeler içeren queryler gönderiryorum mysqle fakat 33.sn suruyor.Tablolarda hiç indexleme yoktu başta hatamın bu olduğunu anladım daha sonra indexledim fakat full text indexledim fakat istediğim şekilde sorgu gönderemiyorum sorgularda yeri geliyor hem isim hemde soyismin uyuşması gerekiyor cunku full textde match against bu konuda ters oluyor.

    select * from tablo where isim = 'Uğur' and soyisim = 'erkan' tel = '055472918xx'; tarzında bir query yine 33sn.yede sonuclanıyor full text indexlemenin hiçbir faydası olmuyor.

    indexin türünü Full text değilde index yapmaya calıstıgımdada

    #1071 - Specified key was too long; max key length is 1000 bytes

    diyor db utf8 1 char 8 byte name 250*8 2000 :|

    indexleme yada sorguları nasıl hızlandırabılecegım konusunda tavsiyesi olan var mı acaba arkadaşlar
  • 11-04-2009, 12:50:34
    #2
    mow
    Üyeliği durduruldu
    "fname" ile "name" i tek bir fulltext index yaparsan sorunun çözülür.
  • 11-04-2009, 12:54:02
    #3
    Üyeliği durduruldu
    suan hepsını tek bir full text yaptım. fakat değişiklik olmadı yukarıda örneğini verdiğim query yine 33 snye suruyor ama select * from tablo match(isim,soyisim,tel) against('Ugur'); diye kalıyorum soy isim için seçenek ekleyemedım.Yapılıyorsada bilmiyorum :S
  • 11-04-2009, 14:06:24
    #4
    aslında 20 milyon içerisinden bir kayıt aramak zaten en optimizie edilmiş bir performanslı kod dahi olsa yavaş olur yani standart bir teknik donanıma göre. Bu durumda performansı arttırmanın diğer yolu sunucunun işlem hızı olur ve performansı kodla sağlasanızda eğer teknik donanımlarınız düşükse yine sunucunuzun hızında belli noktalara kadar ulaşabilirsin, diye düşünüyorum.
  • 11-04-2009, 15:02:09
    #5
    Üyeliği durduruldu
    Konu Hakkında Bilgisi Olmayan Arkadaşlar yorum Yapınca İşler Sapa Sarar.
    Alıntı
    eşleştirmeler ile veri kontrolu yapıyorum
    Arama ile İlgili hiç Bir İşin Yok Yukarda Gördüğüm ve Seninde Yazdığın KAdarı ile...
    Şimdi Verdiğin Örnek Kod ile Senin Full Text ile Zerre Kadar İlgin Yok ve Olmadığı Gibi 20 Milyon Kaydı Kaç Saatte Full Text Yapabildin? Ayrıca Zararınadır Fulltext.

    Senin Yapman Gereken Şey Koşul Kullandığın Alanları İndeks Yapmandır.
    Kullandığın Koşullu Sutunlar ise where deyiminden Sonra Gelenlerdir.
    NOT : index alanlar inserti yavaşlatır.

    Ör:
    1. where isim Burada İsim sade indeksolmalıdır.
    2. UNİQUE leri Gereksiz Yere Kullanma
    3. Alan Özelliklerini Çok İyi Ayarla.
    3.1 Ör. isim, soyisim gibi kısa olabileceğini tahmin ettiğin alanları vanchar 25-30 Yap.
    3.2 Ör. cinsiyet alanını Enum('k','e') Yap.
    3.3 Ör. tarih alanını date yada datetime Yap.
    3.3 Ör. id kullancağın fazla kasmayan yerler için INT Yerine Tnyint Kullan.
    4. NULL ve NOTNULL Kullanman Gerektiği Yerleri iyi Sapta.
    vs vs...
  • 11-04-2009, 15:20:59
    #6
    Üyeliği durduruldu
    dopu bey cevabın ıcın tesekkur ederim
    full textın ısıme yaramayacagını sonradan fark ettim epey sürdü acıkcası :/
    Bilgi karmaşası işte ne yaparsın
    tavsiyelerin içinde ayrıca teşekkür ederim
    bu alan bilgileri zaten olması gerektiği gibi malesef. phpmyadminin field optimize işlemiylede kontrol ettim tavsiye ettiği değerler bunlar.

    inserti yavaşlatması sorun olmayacak hiç benim için şuan getirisi götürüsünden çok daha fazla ve çokca insert update delete vs. yapılmayacak bu tabloda zaten

    arama koşullarında birden fazla sınır eklemek zorundayım verdiğim örnekte olduğu gibi yani butun sütünları indekslemem gerekecek dediğim gibi alan ve insert süresi sorun olmayacak.

    ama sorgu süresini 1-2 saniyeye düşürür diyebilirmiyiz bu çözümün ?

    ayrıca tablo utf8 ve name varchar 240 olunca
    #1071, Specified key was too long; max key length is 1000 bytes

    diyerek hata veriyor bu konuda tavsiyen ne olur acaba ?
  • 11-04-2009, 15:34:32
    #7
    Üyeliği durduruldu
    Name Alanınız için Mysql ne gibi bir Tavsiyede Bulundu?
    Ayrıca Bu hata Zaten Apaçık Belli.
    Girdiğiniz Değer Şuan Var olan Name Alanındaki Verilerin Uzunluğuna (Karakter Uzunluğu ve Byte) 'a Göre Çok Büyük yada Çok Uzun.

    Ayrıca Aramamı Yapmak istiyorsunuz Yoksa Koşullu Veri Çekmek mi Yoksa Hem Arama Hem Koşullu Veri mi?

    Hemn Arama Hem Koşullu Yapmak İstiyosanız.
    Yani.
    isim ve Soyisim = (İnput Arama)
    Şehir : Sabit Select Box
    Cinsiyet : Sabit Radio Buton.
    vs vs...
    Gibi Olacaksa.
    Sadece Name ve Last name Alanlarınızı Full Text Yapınız ve MATCH AGAİNST ile Kullanınız.
    Fultexti En İyi Kullanacağınız ve Performans Alacağınız alan Tİpleri ise Text TinyText ve Long'dur.
    Yani Veri Ne Kadar Büyükse O kadar iyi Fulltext ve MATCH AGAİNST İyi Çalışır.
    Diğer Şekli İle Tabir-i Caizse Dar Alanda Kısa Paslaşmalar olacak FULL TEXT İçin.

    Bana Soracak Olursanız İsim ve Soyisim için arama yapmayın.
    Belirli Sabitleri Verin Eğer Gerekirse Adres kısmını Arama Olarak Kullanın.
  • 11-04-2009, 15:50:56
    #8
    Üyeliği durduruldu
    Evet Koşulllu veri çekmem gerekli.
    İnputlar ile işlem yapmıyorum tablo eşleştirmesi aslında tam anlamıyla.
    a tablosunda isim soyisim tel adres vs. bilgilerini farklı ıhtımalle eşleştirip doğru oldugunu kabul etiğimiz tablodakiyle onaylıyorum.

    MySQL'in verdiği tavsiyeler namein char sayısını 250de tutmam oldu.
    name alanında firma isimleri var bu yuzden uzun kayıtlar var.

    250 karakterden düşüremem indekslemem için bir yol yok mu :S
  • 12-04-2009, 00:01:13
    #9
    Üyeliği durduruldu
    biraz konu disi olmus gibi olacak ama 20 milyon gibi bir kayitla ugrasiyorsaniz oracle a geçin