Endeks nedir?
MySQL'deki dizinler, verileri düzenli bir sıralı şekilde sıralar. Verileri filtrelemek için kullanılacak sütunlarda oluşturulurlar. Bir dizini alfabetik olarak sıralanmış bir liste olarak düşünün. Alfabetik sıraya göre sıralanmış isimleri aramak, sıralanmamış isimlere göre daha kolaydır.
Sık güncellenen tablolarda bir dizin kullanmak, düşük performansa neden olabilir. Bunun nedeni, MySQL'in tabloya her veri eklendiğinde veya güncellendiğinde yeni bir dizin bloğu oluşturmasıdır. Genel olarak, verileri çok sık değişmeyen ancak belirli arama sorgularında çok kullanılan tablolarda indeksler kullanılmalıdır.
Dizin ne kullanır?
Yavaş sistemleri kimse sevmez. Hemen hemen tüm veritabanı sistemlerinde yüksek sistem performansı birinci derecede önemlidir. Çoğu işletme donanıma büyük yatırım yapar, böylece veri alma ve manipülasyon daha hızlı olabilir. Ancak bir işletmenin yapabileceği donanım yatırımlarının sınırı vardır. Veritabanınızı optimize etmek daha ucuz ve daha iyi bir çözümdür.
Yanıt süresindeki yavaşlık genellikle kayıtların veritabanı tablolarında rastgele saklanmasından kaynaklanır. Arama sorguları, istenen verileri bulmak için rastgele depolanan kayıtların tamamında birbiri ardına dolaşmalıdır. Bu, büyük tablolardan veri alma söz konusu olduğunda düşük performanslı veritabanları ile sonuçlanır. Bu nedenle, aramayı kolaylaştırmak için verileri sıralayan Dizinler kullanılır.
Sözdizimi: Dizin Oluştur
Dizinler 2 şekilde tanımlanabilir
- Tablo oluşturma sırasında
- Tablo oluşturulduktan sonra
Myflixdb'miz için veritabanında tam adla çok sayıda arama bekliyoruz.
Yeni bir "members_indexed" tablosunda "full_names" sütununu Index'e ekleyeceğiz.
Aşağıda gösterilen komut dosyası, bunu başarmamıza yardımcı olur.
CREATE TABLE `members_indexed` (`membership_number` int(11) NOT NULL AUTO_INCREMENT,`full_names` varchar(150) DEFAULT NULL,`gender` varchar(6) DEFAULT NULL,`date_of_birth` date DEFAULT NULL,`physical_address` varchar(255) DEFAULT NULL,`postal_address` varchar(255) DEFAULT NULL,`contact_number` varchar(75) DEFAULT NULL,`email` varchar(255) DEFAULT NULL,PRIMARY KEY (`membership_number`),INDEX(full_names)) ENGINE=InnoDB;
Yukarıdaki SQL komut dosyasını MySQL çalışma tezgahında "myflixdb" ye karşı çalıştırın.
Myflixdb'nin yenilenmesi, members_indexed adlı yeni oluşturulan tabloyu gösterir.
"Not" members_indexed tablosunun indeksler düğümünde "full_names" vardır.
Üye tabanı genişledikçe ve kayıt sayısı arttıkça, WHERE ve ORDER BY cümleciklerini kullanan members_indexed tablosundaki arama sorguları, tanımlı indeks olmadan üye tablosunu gerçekleştirenlere göre çok daha hızlı olacaktır.
Dizine temel sözdizimi ekle
Yukarıdaki örnek, veritabanı tablosunu tanımlarken dizini oluşturdu. Zaten tanımlanmış bir tablomuz olduğunu ve bu tablodaki arama sorgularının çok yavaş olduğunu varsayalım. Sonuçları döndürmeleri çok uzun sürüyor. Sorunu araştırdıktan sonra, WHERE yan tümcesinde en sık kullanılan sütunda INDEX oluşturarak sistem performansını büyük ölçüde iyileştirebileceğimizi keşfettik.
İndeks eklemek için aşağıdaki sorguyu kullanabiliriz
CREATE INDEX id_index ON table_name(column_name);
Filmler tablosundaki arama sorgularının çok yavaş olduğunu ve sorguları hızlandırmak için "film başlığı" üzerinde bir dizin kullanmak istediğimizi varsayalım, bunu başarmak için aşağıdaki komut dosyasını kullanabiliriz.
CREATE INDEX `title_index` ON `movies`(`title`);
Yukarıdaki sorguyu yürütmek, filmler tablosundaki başlık alanında bir dizin oluşturur.
Bu, filmler tablosunda "başlık" kullanan tüm arama sorgularının daha hızlı olacağı anlamına gelir.
Filmler tablosundaki diğer alanlardaki arama sorguları yine de dizine alınmış alana dayalı olanlara göre daha yavaş olacaktır.
Not: Veritabanı arama motorunuz için kullanmayı düşündüğünüz alanlara bağlı olarak gerekirse birden çok sütunda dizinler oluşturabilirsiniz.
Belirli bir tabloda tanımlanan dizinleri görüntülemek istiyorsanız, bunu yapmak için aşağıdaki komut dosyasını kullanabilirsiniz.
SHOW INDEXES FROM table_name;
Şimdi myflixdb'deki filmler tablosunda tanımlanan tüm dizinlere bir göz atalım.
SHOW INDEXES FROM `movies`;
Yukarıdaki betiği MySQL çalışma tezgahında myflixdb ile çalıştırmak bize oluşturulan dizinde sonuç verir.
Not: Tablodaki birincil ve yabancı anahtarlar zaten MySQL tarafından indekslenmiştir. Her dizinin kendine özgü bir adı vardır ve tanımlandığı sütun da gösterilir.
Sözdizimi: Dizini bırak
Drop komutu, bir tablodaki önceden tanımlanmış dizinleri kaldırmak için kullanılır.
Bir tabloda sık sık güncellenen bir indeksi zaten tanımladığınız zamanlar olabilir. GÜNCELLEME ve INSERT sorguları performansını iyileştirmek için böyle bir tablodaki dizinleri kaldırmak isteyebilirsiniz. Bir tabloya dizin bırakmak için kullanılan temel sözdizimi aşağıdaki gibidir.
DROP INDEX `index_id` ON `table_name`;
Şimdi pratik bir örneğe bakalım.
DROP INDEX ` full_names` ON `members_indexed`;
Yukarıdaki komutun çalıştırılması, members_indexed tablosundan "full_names" kimliğine sahip dizini bırakır.
Özet
- MySQL arama sorgularının performansını büyük ölçüde iyileştirme söz konusu olduğunda dizinler çok güçlüdür.
- Dizinler bir tablo oluştururken tanımlanabilir veya tablo zaten oluşturulduktan sonra eklenebilir.
- Bir tablodaki birden fazla sütunda dizin tanımlayabilirsiniz.
- SHOW INDEX FROM table_name bir tabloda tanımlanmış indeksleri görüntülemek için kullanılır.
- DROP komutu, belirli bir tablodaki tanımlı bir dizini kaldırmak için kullanılır.