• 18-03-2023, 19:31:48
    #1
    Merhaba,

    Olabildiğince yalın ve teknik terimleri kullanmadan anlatmaya çalışırsak;

    INDEX eklenen yapıyı veritabanımız hafızasına alır. Örneğin biz siparişlerimizin bulunduğu tabloda bir WHERE sorgusu başlattığımızda eğer INDEX kullanmadıysak tüm satırları tek tek sorgulayarak WHERE içeriğine uygun bir veriyi bize sunar. Eğer yüksek kayıt sayısına sahip bir veritabanına sahipseniz bu kesinlikle çok hantal bir sorguya neden olacaktır.

    Eğer biz yapılarımıza INDEX eklersek bu veriyi veritabanımız hafızasına alır ve WHERE sorgusu gerçekleştirdiğimizde tüm satırları aramak yerine direkt olarak WHERE değerlerine uygun satırları önümüze getirir. Büyük bir veritabanına sahipseniz bu kesinlikle sorgu süresinde gözle görülür bir hızlandırma sağlayacaktır.

    Primary Key değerine sahip yapılara INDEX eklemenize gerek yoktur, çünkü eklediğimiz primary key zaten bir INDEX görevi de görmektedir.

    Peki tablomuza nasıl INDEX ekleriz? Öncelikle bunun için phpMyAdmin'e giriş yapıyoruz ve sütunumuzu seçtikten sonra yapılar bölümüne geliyoruz. Buradan en çok sorgu gerçekleştirdiğiniz yapılara bunları ekleyebilirsiniz, bizim tablomuz tüm yapılardan sorgu alan bir tablo olduğu için neredeyse hepsinde mevcut.

    Bu işlem için daha fazla yazısının üzerine imlecimizi getiriyor ve çıkan INDEX seçeneğine tıklayarak onaylıyoruz.

    Görsel için tıklayınız.

    Eğer INDEX değeri verdiğiniz yapıdan bu işlemi kaldırmak istiyorsanız yapıların altında yer alan kaldırabilirsiniz.

    Görsel için tıklayınız.

    Bunun yanı sıra oluşturduğunuz yapıları amacına uygun kullanmakta veritabanı verimliliğini arttıracak bir özelliktir. Örneğin sadece tarih tuttuğunuz bir yapıya DATETIME yerine VARCHAR değeri verirseniz bu yanlış bir kullanım olur. Gerçekleştirdiğiniz ORDER BY işlemlerinde de sıralamayı tarih olarak değil sayıların büyüklük küçüklüğüne göre sıralar.

    İyi çalışmalar.
  • 18-03-2023, 19:38:07
    #2
    Kurumsal Üye
    Softyr adlı üyeden alıntı: mesajı görüntüle
    Merhaba,

    Olabildiğince yalın ve teknik terimleri kullanmadan anlatmaya çalışırsak;

    INDEX eklenen yapıyı veritabanımız hafızasına alır. Örneğin biz siparişlerimizin bulunduğu tabloda bir WHERE sorgusu başlattığımızda eğer INDEX kullanmadıysak tüm satırları tek tek sorgulayarak WHERE içeriğine uygun bir veriyi bize sunar. Eğer yüksek kayıt sayısına sahip bir veritabanına sahipseniz bu kesinlikle çok hantal bir sorguya neden olacaktır.

    Eğer biz yapılarımıza INDEX eklersek bu veriyi veritabanımız hafızasına alır ve WHERE sorgusu gerçekleştirdiğimizde tüm satırları aramak yerine direkt olarak WHERE değerlerine uygun satırları önümüze getirir. Büyük bir veritabanına sahipseniz bu kesinlikle sorgu süresinde gözle görülür bir hızlandırma sağlayacaktır.

    Primary Key değerine sahip yapılara INDEX eklemenize gerek yoktur, çünkü eklediğimiz primary key zaten bir INDEX görevi de görmektedir.

    Peki tablomuza nasıl INDEX ekleriz? Öncelikle bunun için phpMyAdmin'e giriş yapıyoruz ve sütunumuzu seçtikten sonra yapılar bölümüne geliyoruz. Buradan en çok sorgu gerçekleştirdiğiniz yapılara bunları ekleyebilirsiniz, bizim tablomuz tüm yapılardan sorgu alan bir tablo olduğu için neredeyse hepsinde mevcut.

    Bu işlem için daha fazla yazısının üzerine imlecimizi getiriyor ve çıkan INDEX seçeneğine tıklayarak onaylıyoruz.

    Görsel için tıklayınız.

    Eğer INDEX değeri verdiğiniz yapıdan bu işlemi kaldırmak istiyorsanız yapıların altında yer alan kaldırabilirsiniz.

    Görsel için tıklayınız.

    Bunun yanı sıra oluşturduğunuz yapıları amacına uygun kullanmakta veritabanı verimliliğini arttıracak bir özelliktir. Örneğin sadece tarih tuttuğunuz bir yapıya DATETIME yerine VARCHAR değeri verirseniz bu yanlış bir kullanım olur. Gerçekleştirdiğiniz ORDER BY işlemlerinde de sıralamayı tarih olarak değil sayıların büyüklük küçüklüğüne göre sıralar.

    İyi çalışmalar.
    Teşekkür ediyorum harfiyen katılıyorum. Ekstra olarak eğer bir geliştiriciyseniz bazı mysql sürümlerinde boş alanları kabul etmeyerek sorgularınız insert veya updatede hata verebilir. Bu nedenle veritabanınızda genelde göndermediğiniz verileri boş olabilir seçerek seçtirebilir hatta türüne göre varsayılan bir değer atayarak if else durumlarında kendinize rahatlık sunabilirsiniz.
  • 18-03-2023, 19:40:36
    #3
    Güzel ve sade bi' anlatım olmuş..

    Benden de bi' naçizane tavsiye;
    SQL ile içli dışlıysanız kesinlikle SQL'ı atlamayın, UNION, DISTINCT, JOIN gibi sorgular ciddi derecede yükünüzü hafifletir, hatta LIKE kullanımı ya da Query'i ile Replace edileceğini bilmeyenler bile vardır eminim.
    Önüme bazı projeler geliyor adam 156165 tane sorgu kullanarak tablolaları birleştirerek vs verileri bir birine diziye atarak veriye ulaşmış halbuki UNION ile tek satırda bunu yapabiliyorum, SQL'i atlamayın lütfen SQL tek başına bi' konu..
  • 02-05-2023, 16:54:43
    #4
    merhaba
    iilk resim dosyasında 3 adet index eklemişsiniz. gayet güzel
    peki aramayı hangi index üzerinden yapılacağını tanımlıyor musunuz , nasıl ?
    veya basit select * from tablo sorgunuz içinde almak istediğiniz alan veya where içinde tanımladığınız alan/larda 3 index alanı da varsa sorgu önceliği hangi index e atıyor ?

    örnek ekleyebilir misiniz ?
  • 02-05-2023, 19:22:03
    #5
    Anlatım güzel ancak, kısmi olarak bir kısım eksik olmuş. Gereksiz index daha fazla yer tüketimine sahiptir.

    Ayrıca index'ten verim alabilmeniz için where sorgusunda hangi alanları kullanıyorsanız o alanları indexlemelisiniz.

    tosunpasa adlı üyeden alıntı: mesajı görüntüle
    merhaba
    iilk resim dosyasında 3 adet index eklemişsiniz. gayet güzel
    peki aramayı hangi index üzerinden yapılacağını tanımlıyor musunuz , nasıl ?
    veya basit select * from tablo sorgunuz içinde almak istediğiniz alan veya where içinde tanımladığınız alan/larda 3 index alanı da varsa sorgu önceliği hangi index e atıyor ?

    örnek ekleyebilir misiniz ?

    Phpmyadminde tablonun sütun listesinin en altında index listesi görünür orada öncelik belirtebilirsiniz.

    Verileri Birden fazla değere göre süzüyorsanız örnek category_id,post_status olsun sütunlar. İki sütunu aynı anda seçerek index oluşturmalısınız.
  • 02-05-2023, 23:04:10
    #6
    ek olarak bende daha komplike bir durum için katkı sağlayayim.

    where de category_id, post_status olsun + olarak order by category_id olsun,
    bu durumda, category_id ve post_status un bir arada olduğu indexin yanı sıra de category_id nin tekli index i gerekir.
    ayrıca mysql de sum gibi matematiksel işlemlerde mysql index kullanmaz.

    büyük tablolarda indexler durumunuza çözüm olmuyorsa mysql 8+ ile beraber partition kullanımını şiddetle tavsiye ederim.

    Perfection adlı üyeden alıntı: mesajı görüntüle
    Anlatım güzel ancak, kısmi olarak bir kısım eksik olmuş. Gereksiz index daha fazla yer tüketimine sahiptir.

    Ayrıca index'ten verim alabilmeniz için where sorgusunda hangi alanları kullanıyorsanız o alanları indexlemelisiniz.




    Phpmyadminde tablonun sütun listesinin en altında index listesi görünür orada öncelik belirtebilirsiniz.

    Verileri Birden fazla değere göre süzüyorsanız örnek category_id,post_status olsun sütunlar. İki sütunu aynı anda seçerek index oluşturmalısınız.