MySQL İçindekiler: Oluşturma, Ekleme ve Silme Eğitimi
⚡ Akıllı Özet
MySQL İndeks Eğitimi, indekslerin verileri nasıl hızlı bir şekilde sıraladığını ve bulduğunu ele almaktadır. İndeks, bir veya daha fazla sütun üzerinde oluşturulan sıralı bir arama yapısıdır; CREATE INDEX komutu indeksi ekler, SHOW INDEXES komutu indeksi inceler ve DROP INDEX komutu ise yazma işlemlerinin okuma işlemlerinden daha fazla olduğu durumlarda indeksi kaldırır.

Nedir MySQL Dizin?
An indeks in MySQL İndeks, veri işleme motorunun satırları hızlı bir şekilde bulabilmesi için sütun değerlerini sıralı bir şekilde depolayan bir veri yapısıdır. İndeksler, verileri filtrelemek için en sık kullanılan sütun veya sütunlar üzerinde oluşturulur. Bir indeksi alfabetik olarak sıralanmış bir liste gibi düşünün: Sıralı bir listede bir ismi bulmak, sıralanmamış bir yığında bulmaktan çok daha hızlıdır.
İndekslerin bir dezavantajı vardır: Her INSERT veya UPDATE işlemi indeksi korumak zorundadır, bu nedenle yazma işlemlerinin yoğun olduğu bir tabloya çok fazla indeks eklemek genel performansı olumsuz etkileyebilir. Genel bir kural olarak, yazılma işlemlerinden daha sık okunan tablolarda WHERE, JOIN ve ORDER BY yan tümcelerinde yer alan sütunlara indeks ekleyin.
İndeks Neden Kullanılır?
Yavaş sistemleri kimse sevmez. Yüksek performans, neredeyse her veritabanı tabanlı uygulama için en önemli önceliklerden biridir. İşletmeler, sorguları hızlı tutmak için donanıma büyük yatırımlar yaparlar, ancak donanımın tek başına sağlayabileceği performansın bir sınırı vardır. İndeksleri optimize etmek daha ucuz ve daha etkili bir çözümdür.
Yavaş yanıt süreleri genellikle satırların diskte fiziksel sırayla depolanmasından kaynaklanır. İndeks olmadan, MySQL Bir koşula uyan satırları bulmak için her satırı taramak gerekir; bu bir "tam tablo taraması"dır. İndeksler, bu işlemi mümkün kılar. MySQL Doğrudan eşleşen satırlara atlamak, sorgu planını B-ağacı aramaları için O(n)'den yaklaşık O(log n)'ye dönüştürür.
Sözdizimi: Dizin Oluştur
Bir indeks iki yerde tanımlanabilir:
- Tablo oluşturulduğu sırada.
- Tablo zaten oluşturulduktan sonra.
Örnek: CREATE TABLE komutuyla satır içi indeks oluşturma
Için myflixdb Veritabanımızda, tam ad sütununda çok sayıda arama bekliyoruz. Aşağıdaki komut dosyası yeni bir kayıt oluşturur. members_indexed indeks içeren tablo full_names sütun.
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;
Komut dosyasını şurada çalıştırın: MySQL Çalışma tezgahına karşı myflixdb veri tabanı.
Yenile myflixdb yeniyi görmek için members_indexed tablo. NS full_names Sütun artık altında görünüyor. Dizinler düğümü.
Üye sayısı arttıkça, arama sorguları da artıyor. members_indexed WHERE ve ORDER BY ifadelerini kullananlara karşı full_names Orijinalindeki aynı sorgulara göre çok daha hızlıdırlar. members İndeks içermeyen tablo.
Tablo zaten mevcut olduktan sonra bir indeks ekleyin.
Sıklıkla mevcut bir tablonun dizine ihtiyaç duyduğunu fark edeceksiniz; arama sorguları yavaş çalışır ve EXPLAIN planı, WHERE ifadesinde görünen bir sütunda tam tablo taraması gösterir. CREATE INDEX Bu ifade, tabloyu yeniden oluşturmadan bir dizin ekler.
CREATE INDEX `id_index` ON `table_name` (`column_name`);
Somut örnek — aramaları hızlandırmak title sütunu movies tablosu:
CREATE INDEX `title_index` ON `movies` (`title`);
Filtreleme yapan her sorgu movies.title Artık yeni indeks tarafından destekleniyor. Diğer sütunlara göre filtreleme yapan sorgular, kendi indekslerine sahip olmadıkları sürece tabloyu taramaya devam eder.
Not: Sorgularınız her zaman aynı kombinasyona göre filtreleme veya sıralama yapıyorsa, birden fazla sütun üzerinde bileşik bir dizin oluşturabilirsiniz. Sıralama önemlidir; önde gelen sütun, dizinin kullanılıp kullanılamayacağını belirler.
Bir tablodaki indeksleri listele
Kullanım SHOW INDEXES Bir tabloda tanımlanmış tüm indeksleri görmek için.
SHOW INDEXES FROM `table_name`;
Örnek — liste indeksleri movies tablosu:
SHOW INDEXES FROM `movies`;
İfadeyi çalıştırın. MySQL Tezgâh karşı myflixdb Mevcut indeksleri ve kapsadıkları sütunları görmek için.
Not: Birincil ve yabancı anahtarlar otomatik olarak indekslenir. MySQLHer dizinin kendine özgü bir adı vardır ve kapsadığı sütunları listeler.
Sözdizimi: İndeksi Bırak
Kullanım DROP INDEX Bir tablodan mevcut bir dizini kaldırmak. Bu, yazma işlemlerinin yoğun olduğu bir tablonun, okuma tarafında artık işlevini yerine getirmeyen bir dizin nedeniyle yavaşladığı durumlarda faydalıdır.
DROP INDEX `index_id` ON `table_name`;
Somut örnek — düşürün full_names dizinden members_indexed:
DROP INDEX `full_names` ON `members_indexed`;
Tipleri MySQL Dizinler
MySQL Çeşitli iş yüklerine uygun birçok indeks türünü destekler.
| Menşei | Amaç |
|---|---|
| BİRİNCİL ANAHTAR | Benzersiz satır tanımlayıcısı; InnoDB'deki tablo verileriyle birlikte kümelenmiştir. |
| EŞSİZ | Hem benzersizliği sağlar hem de bir indeks görevi görür. |
| DİZİN (B-ağacı) | Aralık sorguları ve eşitlik aramaları için kullanılan varsayılan ikincil dizin. |
| TAM METİN | MATCH … AGAINST ile doğal dil metin araması için optimize edilmiştir. |
| MEKANSAL | POINT ve POLYGON gibi GIS veri tipleri için R-ağacı indeksi. |
| HASH | Sabit zamanlı eşitlik aramaları; MEMORY depolama motoru tarafından kullanılır. |
| Kompozit (çok sütunlu) | Birden fazla sütunu tek bir dizinde birleştirir; en soldaki önek kuralına uyar. |
için En İyi Uygulamalar MySQL Dizinler
Aşağıdaki alışkanlıklar, endekslerin kullanışlı kalmasını ve gereksiz yük haline gelmesini önler.
- Sorgu kalıbına ait dizin, sütun adına ait dizin değil: Gerçek WHERE, JOIN ve ORDER BY koşullarıyla eşleşen indeksler ekleyin, "önemli görünen her sütun"u değil.
- Bileşik endeks sıralamasını izleyin: İndeksin kullanılabilmesi için, sorguda önde gelen sütunun yer alması gerekir.
- Yinelenen dizinlerden kaçının: Birleşik dizinin önde gelen bir öneki, o önek üzerindeki tek sütunlu aramaları zaten kapsar.
- EXPLAIN ile inceleyin: Planlayıcının gerçekten yeni endeksi seçtiğini doğrulayın.
- Kullanılmayan indeksleri silin: kullanım
sys.schema_unused_indexesin MySQL 5.7 ve üzeri sürümler, hiçbir şeyin okumadığı indeksleri bulmak için kullanılır. - Veri türlerini eşleştirin: Bir WHERE yan tümcesi bir VARCHAR sütununu bir sayıyla karşılaştırıyorsa, örtük bir tür dönüştürme nedeniyle indeks kullanılamaz.


