MySQL - VIEW içinde Index

Diğer veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

MySQL - VIEW içinde Index

Mesaj gönderen SimaWB »

MySQLde VIEW içerisinde Index tanımlayamıyoruz bildiğim kadarıyla. Bundan dolayı benim için performansın(sorgu sonucuna hızlı erişmenin) çok önemli olduğu bir konuda sizlerden tavsiye rica ediyorum:

Kişi bilgilerinin tutulduğu bir tablo(tblRehber) olduğunu düşünelim. Her kişiye ait istenildiği kadar telefon numarası girilebilmesi gerekiyor. Dolayısıyla tblNumbers adında telefon numaralarının tutulduğu bir tablo tanımladım. Ve bu tabloyu Foreign Key ile tblRehber ile ilişkilendirdim.

Amacım çok hızlı bir şekilde verilen bir telefon numarasının kime ait olduğunu bulmak. Fakat telefon numarası çevrilmeye başladığı anda eşleştirmeye çalışacağım için(yani her tuşa basıldığında) performans çok önemli. Ben böyle bir durumda VIEW kullanmayı düşünmüştüm ama başlangıçta da belirttiğim gibi VIEW içinde Index tanımlanamıyor.

VIEW, Stored Procedure, MySQL Function... Hangisi benim için en ideal çözüm olur?

Memory Table kullanmayı da düşündüm ama henüz onu denemeden burada sizlerin fikirlerini almak istedim. Memory Table kullansam da yine iki tablonun birleştirilmesi gerekecek sanırım.
There's no place like 127.0.0.1
Kullanıcı avatarı
esistem
Üye
Mesajlar: 464
Kayıt: 02 Eki 2007 11:22
İletişim:

Re: MySQL - VIEW içinde Index

Mesaj gönderen esistem »

Selam,
biraz zaman geçmiş üzerinden ama ben olsam şöyle yapardım,
amacım taramada hızlı sonuç ise lookup yada join bu işi yavaşlatır, 2 tablo yapardım aynı şekilde fakat tel noların bulunduğu tabloya isim ve soyisim alanlarınıda eklerdim, böylece tek tablodan dönen sonucu alırdım. İsim yada soyisim güncellenince de ona ait tel nolarda da güncelleme apardım. tel no ları alanınıda alan kodu ve telno olarak ayırıp değerlerinide integer verip indexlerdim, böylece mesela;
0999 1234567 şeklinde telno çevrilirken önce alan kodunun çevrilmesini bekleyip, yani ilk 3 karakter bitince (0 ı hesaba katmıyorum) sorguyu çalıştırıp sadece o alan kodlarında arama yapmasını sağlardım. sanırım en hızlı çözüm bu şekilde olur. Bunu bide Stored Procedure ile yaparsanız sanırım sonucu sizi memnun edecektir.
Kullanıcı avatarı
Battosai
Üye
Mesajlar: 1316
Kayıt: 01 Eki 2007 12:02
Konum: Ankara

Re: MySQL - VIEW içinde Index

Mesaj gönderen Battosai »

Her durumda temel etken kayıt ve kullanıcı sayısıdır. Memory table için fazla kayıt sorun çıkarabilir. View kullanımının MySQL de performans için bir dezavantaj olduğu görülüyor. En iyi view çözümü olan MERGE view de işin içine join,function,group by... girince uygulanmıyor. Kısacası view'leri böyle aktif arama işleri için değilde belki raporlar gibi diğer işler için kullanmak daha uygundur. Her karaktere basınca arama işlevi kayıt sayısının az olduğu veya olacağı tablolar için memory çözümleri kullanılabilir. Hatta gerek bile yoktur. Fakat çok kullanıcılı yoğun bir sunucuda işlemler gerçekleşiyorsa ve kayıt sayısı fazla ise farklı çözümlere yönelmek lazımdır. Key=Value tarzı hızlı arama için tasarlanmış farklı db yöneticileri kullanmak ve donanımsal yük dağılımı yapmak gerekebilir. Kısaca yöntemi kayıt sayısı belirler diyebiliriz. Programcı yeni duruma göre sistemi revize etmeli.
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Re: MySQL - VIEW içinde Index

Mesaj gönderen vkamadan »

Merhabalar ,

Evet MySQL de VIEW ler için özel olarak index tanımlanmıyor fakat bildiğim ve tecrübe ettiğim kadarıyla view e uygulayacağınız WHERE de ki alanlar için fiziksel tablolarının için de yer alan alanların index leri kullanılıyor tblNumbers de telefon no alanınız index liyse sorun olmamalı. hatta index in gerçekten kullanıldığını şöyle teyid edebilirsiniz EXPLAIN SELECT hesapadi FROM viewRehber WHERE telefonno ="xxxxx" gibi bir sorguda "key" sütunun da varsa tblNumbers telefonno indexinin kullanıldığını göreceksiniz.

Ben geçmişte MySQL deki view lerin önce view syntax ı neyse komple çekilip varsa WHERE deyimi ilgili veriseti üzerinde tıpkı HAVING in yaptığı gibi filtre uyguluyor zannediyordum ama öyle değil VIEW i kullanırken vereceğiniz WHERE deyimi ayrıştılıp doğrudan index kullanılarak sonuç veriseti direk geliyor.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: MySQL - VIEW içinde Index

Mesaj gönderen SimaWB »

Hepinize yorumlarınız için teşekkür ederim.

Program ve veritabanı müşterilerin bilgisayarlarında çalışacak. Dolayısıyla normal durumda sadece tek bir kullanıcı(yazdığım program) MySQL'e bağlı olacak.
Her müşterinin kendi veritabanı olacağı için kayıt sayısı fazla olmayacaktır. Genelde telefon rehberi 500-1000 kayıt civarında olabilir. Sadece bir kaç müşteride rehberde 5000'in üzerinde kayıt olması muhtemel. Her kişinin ortalama 2 telefon numarası var diye düşünürsek tblNumbers tablosunda ortalama 1000-2000 kayıt arasında olacaktır.

Aslında soruyu sorarken bu bilgileri vermem gerekiyordu, kusura bakmayın.

Bu veriler doğrultusunda belki yorumlarda değişiklik olabilir, yada yeni yorum yapmak isteyen olabilir diyerek konunun güncel olduğunu belirtmek isterim.
There's no place like 127.0.0.1
Cevapla