[teknik]
(4) 

MYSQL Index

tchuck #677212
arkadaşlar bunun mantığını kavramam lazım.

bir örnek üstünde yardımcı olur musunuz acaba?

örneğin; "şimdi şunu yazınca, şu tablodaki şu veriler şöyle şöyle oldu. eğer böyle yazsaydım böyle böyle olurdu. şu tip arama işlemleri için böyle böyle yazmak daha iyidir" tarzı bir yardıma ihtiyacım var.

nette hep aynı şeyden bahsetmişler: index sadece görüntüdür, aramalarda kolay yanıt almanı sağlar, yeni veri girişi veya değişimi olursa aynı anda güncellenir.

ama bu benim istediğim cevap değil ki?
ben bir kodu yazdığımda neleri indexlemiş oluyorum, sadece tek bir sütunu mu yoksa komple tabloyu mu, ne bileyim bunun gibi şeyler istiyorum. neleri saklamış oluyorum yani.


edit: ben örnek vereyim hatta.

şimdi kitaplar isimli tablomuz var.

kitap---yazar---yayinevi (bundan sonraki sütunlar, fiyat, iskonto vs. diye gidiyor)

şimdi, biz bu tabloda bazen kitaba göre eşleşme yapacağız, bazen yazara, bazen yayinevine göre.

yazara göre yapılan eşleşmenin daha hızlı olması için

ne yazmamız gerekiyor? ya da yayinevine göre ayrı, yazara göre ayrı, kitaba göre ayrı index mi oluşturmak gerekiyor?

(şimdi diyelim ki; yazarın sayfası açılacak. o sayfada, o yazarın kitapları sıralanacak. dolayısıyla yazar adı Hüsnü Bilmemne olan tüm kitapları sıralamamız gerekecek. -kitap adı, yayinevi adı, fiyat, açıklama vs.- böyle bir durumda nasıl bir indexleme yapmam gerekir?)

 

ilk olarak sunu bi okumani oneririm (bkz: normalizasyon).
normalizasyonu duzgun yaptiysan sorgularin sunun gibi olacak zaten
select * form kitapler where yazar_id=123;
yapmis oldugun sorguya gore de her sutunu indexlemen gerekecek gibi gorunuyor.

wishmaster

anladım. yani "kitaplar" tablosunda "yazarlar" sütununu, "yazarlar" tablosundaki, yazarlara karşılık gelen id'lerle doldurayım öncelikle.

sürekli dışarıdan veri çektiğim için bu sistemimi biraz değiştirecek ama işin doğrusu neyse onu yapalım.

edit: bir de hala tam çözemedim ama. diyelim CREATE INDEX kitaps ON kitaplar (yazar);

dedim. böyle bir şey yaptığımda, bu, tüm listeyi sıralıyor değil mi? yani yazar adına göre bir sıralama yapıyor ama aynı zamanda tüm sütunlar yer alıyor dimi? (yanlış sordum galiba ama)

tchuck

syntaxi dogrumu emin degilim yazdigin seyin ama dogruysa sadece yazar sutununa index ekler.
tablo olusturma/degistirme vs islemler icin sqlyog kullanmani oneririm.

wishmaster

sütunlar indekslenir, tablolar değil.

bir sütunu indekslediğinizde o sütundaki verilerin bir nevi kataloğu çıkartılır. yani içinde binlerce kitap olan bir kütüphane düşünün. siz bu kütüphanede "yeraltından notlar" kitabını arıyorsunuz. elinizde herhangi bir katalog yoksa sırayla kütüphanedeki bütün kitaplara bakmanız gerekir. halbuki kitapların alfabetik olarak sıralanmış biçimde listelendiği ve hangi bölümün hangi rafında olduklarını gösteren bir katalog varsa buradan şıp diye bakıp bulursunuz. aynı şekilde yazar adına göre sıralanmış bir katalog varsa dostoyevski'nin bütün kitaplarını kolayca bulabilirsiniz.

"CREATE INDEX kitaps ON kitaplar (yazar);" dediğinizde yazar kolonuna göre bir indeks oluşturulur.

dezavantajı şu: elinizde örneğin kitap adı ve yazar adına göre sıralanmış indeksler (kataloglar) varsa bunlar hem yer kaplar, hem de kütüphanenize kitap ekleyip çıkardıkça sürekli güncellenmeleri gerekir, bu da çalışma hızınızı yavaşlatır. yani örneğin kimse kitapları yayınevine veya kapağının rengine göre aratmıyorsa o zaman yayınevine veya kapak rengine göre sıralanmış bir katalog bulundurmak gereksizdir.

yani indeksleri yalnızca arama yapılan (WHERE...) kolonlar için çıkartmanız gerekir. diyelim ki dostoyevski kitapları çıkaran yayınevlerini merak ediyorsunuz. yine kütüphane örneğine dönelim. yazar adına göre sıralanmış bir kataloğa bakarak dostoyevski'nin bütün kitaplarını kolayca bulabilirsiniz. sonraki iş bu kitaplara sırayla bakarak yayınevlerini listelemek olur. yayınevine göre sıralanmış bir liste burada hiçbir işinize yaramaz, çünkü aramayı yazar adına göre yaptık. dolayısıyla yazar kolonunun indekslenmesi yeterli.

özet: indeksler arama işlemlerini hızlandırır, veri ekleme ve çıkarma işlemlerini yavaşlatır. arama yapılan kolonları indekslemeniz sorgu performanslarını arttırır. arama yapılmayan kolonları indekslemenizin ise hiçbir faydası olmaz, yavaşladığınızla kalırsınız.

bir de özel tip indeksler var.
unique indeks oluşturduğunuz bir kolondaki bütün veriler birbirinden farklı olmak zorundadır. ("bu kütüphanede aynı kitaptan iki tane olamaz" gibi bir kısıtlama.) örneğin email kolonuna unique indeks oluşturarak aynı email'e sahip birden fazla kullanıcı hesabı açılmasını önleyebilirsiniz.

primary key ise unique gibi olup bir tabloda en fazla 1 kolon primary key olabilir. bu da genelde normalizasyon denen işte kullanılıyor. örneğin kitaplar diye bir tablo açıp yayınevi kolonuna 50 kere "can yayınları" yazmak yerine yayınevleri diye bir tablo açıp "id=1 isim=can yayınları" diye bir satır ekledikten sonra kitaplar tablosunda yayınevi_id kolonuna 1 koyabilirsiniz. bu sayede hem kitaplar tablosu çok daha az yer kaplar, hem can yayınları'nın adı değişirse yalnızca yayınevleri tablosunu güncellemeniz yeterli olur (kötü bir örnek oldu ama idare edin). işte bu durumda yayınevleri tablosundaki id kolonu primary key oluyor. yani her yayınevinin bir id'si olmak zorunda ve bu id'ler her yayınevi için farklı olmalı. bir de bu primary key'i auto_increment yaparsanız mysql yeni kayıtlar için primary key'leri kendisi oluşturur. yani "insert into yayinevleri (yayinevi_adi) values ('iletişim')" derseniz "yayinevi_id=2 yayinevi_adi=iletişim" diye bir satır eklenir.

386 dx
1

mobil görünümden çık