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.

  • 📚 İndeksleri bir sözlük gibi ele alın: Sütun değerlerini sıralayarak, arama motorunun tüm tabloyu taramadan satırları bulmasını sağlarlar.
  • Masada veya sonrasında oluşturun: Bir tablo üzerinde CREATE TABLE komutuyla indeks tanımlayabilir veya daha sonra CREATE INDEX komutuyla indeks ekleyebilirsiniz.
  • 🔍 SHOW INDEXES ile inceleyin: Her bir dizini, anahtar bölümünü, kardinaliteyi ve benzersizlik bayrağını listelemek için SHOW INDEXES FROM table_name komutunu kullanın.
  • 🧹 Yazma maliyeti çok yüksek olduğunda bırak: İndeksler INSERT ve UPDATE işlemlerini yavaşlatır; kullanılmayan indeksleri DROP INDEX komutuyla silerek yazma verimliliğini artırabilirsiniz.
  • 🤖 İndeks tasarımı için yapay zekayı kullanın: Yapay zekâ asistanları, yavaş sorgu günlüklerini okur, bileşik indeksler için sütun sıralamaları önerir ve EXPLAIN planlarını satır satır açıklar.

MySQL İndeks kavramı

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.

MySQL İndeks kavramı

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:

  1. Tablo oluşturulduğu sırada.
  2. 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ı.

members_indexed tablosunda MySQL Tezgâh

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_indexes in 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.

SSS

Birincil anahtar, her satırı benzersiz şekilde tanımlar ve her zaman indekslenir. Genel bir indeks, aramaları hızlandırır ancak yinelenen değerlere izin verir. Her birincil anahtar bir indekstir, ancak her indeks birincil anahtar değildir.

Çok küçük tablolarda, çok az sayıda farklı değere sahip sütunlarda (düşük kardinalite) ve okuma işleminden çok daha sık yazılan tablolarda indekslerden kaçının. Her ek indeks, her INSERT, UPDATE ve DELETE işlemini yavaşlatır.

Birleşik (çok sütunlu) indeks, tek bir indekste birden fazla sütunu kapsar. En soldaki önek kuralına uyar, bu nedenle ilk sütuna, ilk iki sütuna vb. göre filtreleme yapan sorgulara hizmet edebilir, ancak yalnızca ikinci sütuna göre filtreleme yapan sorgulara hizmet edemez.

koşmak EXPLAIN SELECT ifadesinin önüne. anahtar Sütun, optimizasyon aracının hangi indeksi seçtiğini gösterirken, tip hem de satır Erişim yolunun verimli olup olmadığını size bildirir.

Kapsayıcı bir indeks, sorgunun ihtiyaç duyduğu her sütunu içerir; bu nedenle motor, tabloyu okumadan yalnızca indeksi kullanarak sorguyu yanıtlar. Bu durum gerçekleştiğinde EXPLAIN komutu "İndeks kullanılıyor" şeklinde bir çıktı verir.

Yaygın nedenler arasında sarma yer alır.ping bir fonksiyondaki sütun (WHERE YEAR(col) = …), örtük tür dönüştürmeleri, çok düşük kardinalite ve güncel olmayan istatistikler. Çalıştır ANALYZE TABLE İstatistikleri yenilemek ve incelemek için EXPLAIN Asıl sebep için.

Yapay zekâ asistanları, yavaş sorgu günlüklerini işler, en maliyetli kalıpları sınıflandırır, tek sütunlu veya bileşik indeksler önerir ve EXPLAIN planlarını sade bir dille açıklar. Rutin iş yükleri için ayarlama süresini saatlerden dakikalara indirirler.

Evet. Yapay zeka araçları, "müşteri aramalarını e-posta ve kayıt tarihine göre hızlandır" gibi bir isteği çalışan bir CREATE INDEX ifadesine dönüştürür, sütun sırasını önerir ve okuma ve yazma verimliliği üzerindeki beklenen etkiyi açıklar.

Bu yazıyı şu şekilde özetleyin: