MySQL veritabanında birleşik dizin ve en soldaki eşleştirme ilkesini açıklayın

Genel Bakış

Daha önce İnternette mysql ortak dizininin en soldaki önek eşleştirmesi hakkında birçok makale görmüştüm ve bunlar oldukça genel, bu yüzden bugün bu alandaki içeriği sıralayıp bir not yazacağım!

Mysql'deki ortak dizinin en soldaki eşleşme ilkesi

Mysql'de çok sütunlu bir dizin (ortak dizin) oluşturma ilkesi, en soldaki ön eke, yani en soldaki ilke sahiptir.

İki sütunlu birleşik indeks (col1, col2) oluşturursak, aslında iki ortak indeks (col1), (col1, col2) oluşturulmuştur;

Üç sütunlu bir dizin (col1, col2, col3) varsa, aslında üç birleşik dizin (col1), (col1, col2), (col1, col2, col3) oluşturulmuştur.

Açıklama:

1. b + ağacının veri öğesi, (ad, yaş, cinsiyet) gibi bileşik bir veri yapısıdır; b + ağacı, arama ağacını soldan sağa sırayla oluşturur, örneğin (Xiaoming, 20, F) Veriler alındığında, b + ağacı ilk önce bir sonraki arama yönünü belirlemek için adı karşılaştıracaktır.Eğer isim aynıysa, sırayla yaş ve cinsiyeti karşılaştıracak ve son olarak alınan verileri alacaktır; ancak (20, F) gibi bir isim olmadığında Veriler geldiğinde, b + ağacı ilk adımda hangi düğümü kontrol edeceğini bilmez, çünkü ad, arama ağacını oluştururken ilk karşılaştırma faktörüdür ve daha sonra nereye bakacağınızı bilmek için önce ada göre arama yapmanız gerekir.

2. Örneğin, (Xiaoming, F) gibi verileri ararken, b + ağacı arama yönünü belirtmek için adı kullanabilir, ancak sonraki alan yaşı eksiktir, bu nedenle yalnızca Xiaoming'e eşit ada sahip tüm verileri bulabilir ve ardından cinsiyeti eşleştirebilirsiniz. F'nin verisidir. Bu çok önemli bir özellik, yani dizinin en soldaki eşleşen özelliğidir.

Burada birleşik indeksin sırasına dikkat etmeliyiz, eğer ortak indeks (col1, col2, col3) ise, ancak col3 = xx ve col2 = xx olduğunda, bu tür indeks gerçekte kullanılmayacaktır.

Mysql'nin ortak indeks oluşturmanın önemi

İlk üç

Bileşik bir (a, b, c) indeksi oluşturulur, bu durumda aslında üç indeksin (a), (a, b), (a, b, c) oluşturulmasına eşdeğerdir, çünkü her ek indeks yazma işlemlerini artıracaktır. Ek yük ve disk alanı ek yükü. Büyük miktarda veri içeren tablolar için bu küçük bir ek yük değildir.

Kapsama endeksi

Benzer şekilde, aşağıdaki sql varsa, bileşik dizinler (a, b, c) vardır: a = 1 ve b = 1 olan tablodan a, b, c'yi seçin. Daha sonra MySQL, tabloya dönmeden dizini geçerek doğrudan veri elde edebilir, bu da birçok rastgele io işlemini azaltır. İo işlemlerini azaltın, özellikle rasgele io aslında dba'nın ana optimizasyon stratejisidir. Bu nedenle, gerçek pratik uygulamalarda, kaplama indeksi, performansı artırmak için ana optimizasyon yöntemlerinden biridir.

Ne kadar çok dizin sütunu olursa, dizinde o kadar az veri filtrelenir

1000W veri içeren bir tablo aşağıdaki SQL'e sahiptir:

a = 1 ve b = 2 ve c = 3 olan tablodan * seçin

Her koşulun verilerin% 10'unu filtreleyebileceğini varsayarsak, yalnızca tek bir değer endeksi varsa, 1000W *% 10 = 100w veri parçası dizinden filtrelenebilir ve ardından b = 2'yi karşılayan 100w veri parçasını bulmak için tabloya dönebilir ve c = 3 veri, ardından sıralayın ve ardından sayfalandırma; eğer bu bir bileşik dizin ise, dizinden 1000w * 10% * 10% * 10% = 1w filtreleyin ve sonra sıralayıp sayfalamayı söylemeye gerek yok.

Ortak bir dizin oluştururken sütun seçim ilkeleri

  • Önce sık kullanılan sütun (en soldaki eşleştirme ilkesi)
  • Yüksek dispersiyonlu kolon tercih edilir (yüksek dispersiyon prensibi)
  • Daha küçük genişliğe sahip sütun önceliklidir (en az boşluk ilkesi)
  • Sütun ayrık hesaplama: sayma (farklı sütun) / sayma (sütun)

    Örneğin:

    İd sütunu 9/9 = 1'i tekrar etmeden 9 sütundur

    Cinsiyet sütununda 9 sütun vardır, yalnızca iki sütun (erkek veya kadın). 2/9 yaklaşık olarak 0.2'ye eşittir.

    Dağılım ne kadar yüksekse seçicilik o kadar büyüktür

    Örnek gösteri

    1. Bir test tablosu oluşturun

    TABLO OLUŞTUR "öğrenci" ( `id` int (11) NULL DEĞİL, `isim` varchar (10) BOŞ DEĞİL, `age` int (11) NULL DEĞİL, BİRİNCİL ANAHTAR ("id"), ANAHTAR "idx_id_name_age" ("id", "isim", "yaş") ) MOTOR = InnoDB VARSAYILAN KARAKTER = utf8

    2. 100w test verilerini doldurun

    BIRAKMA PROSEDÜRÜ pro10; PROSEDÜR OLUŞTUR pro10 () BAŞLA BİLDİRİN i INT; DECLARE char_str varchar (100) DEFAULT'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 '; DECLARE return_str varchar (255) VARSAYILAN ''; BEYAN yaş INT; SET i = 1; BEN < 5000000 do SET dönüş_dizesi = alt dize (karakter_dizesi, TABAN (1 + RAND () * 62), 8); SET i = i + 1; SET yaş = KAT (RAND () * 100); INSERT INTO öğrenci (id, isim, yaş) değerleri (i, dönüş_dizesi, yaş); BİTİRKEN; SON; ÇAĞRI pro10 ();

    3. Sahne testi

    İd = 2;

    Burada sorgunun dizini kullandığını görebilirsiniz

    İd = 2 AND name = 'WXYZ0123';

    Sorgunun dizini kullandığını görebilirsiniz.

    İd = 2 VE ad = 'WXYZ0123' ve yaş = 51 NEREDE öğrenciden SEÇİMİ AÇIKLAYIN;

    Sorgunun dizini kullandığını görebilirsiniz.

    İd = 2 VE yaş = 51 NEREDE öğrenciden SEÇİMİ * AÇIKLAYIN;

    Sorgunun dizini kullandığını görebilirsiniz.

    SEÇİMİ * AÇIKLAYIN öğrenciden NEREDE name = 'WXYZ0123' VE yaş = 51;

    Sorgunun dizini kullanmadığını, türünün dizin olduğunu, sorgu satırlarının sayısının 812567 olduğunu ve neredeyse tam bir tablo taraması yapıldığını görebilirsiniz. Birleşik dizin yalnızca en soldaki sütun için sıralandığından, yalnızca ad ve yaş taranabilir tümü

    SEÇİMİ * ÖĞRENCİDEN AÇIKLAYIN ad = 'WXYZ0123' VE id = 2; SEÇİMİ * AÇIKLAYIN Öğrenciden yaş = 51 VE id = 2; SEÇİMİ * ÖĞRENCİDEN AÇIKLAYIN ad = 'WXYZ0123' ve yaş = 51 VE id = 2;

    Yukarıdaki sorgunun da bir dizin kullandığını görebilirsiniz.İd'den önceki ve sonraki sorgunun sonuçları aynıdır.MySQL, ilk önce id'ye göre sorgulama olan en verimli sorgu yöntemini bulur.

    sonuç olarak

    Yukarıdaki testte, sorgu koşulunun sütunu bileşik dizinin en soldaki sütununu içerdiği sürece, sütunun sorgu koşulundaki konumu ne olursa olsun, dizinin sorgu için kullanılacağını görebilirsiniz.

    Daha sonra daha fazla mysql içeriği paylaşacağım ve ilgilenen arkadaşlar buna dikkat edebilir! !

    Elektrikçilerin okuması gereken 30 yüksek gerilim sekonder devre şeması, elektrikçilerin% 80'inden fazlasının deneyimli olması gerektiğini bilin
    önceki
    990 milyar! Eski makinenin performansını kasıtlı olarak düşürme skandalı Apple'ı titretmişti: Gerçekten buna gücüm yetmez!
    Sonraki
    "Deformasyon Ölçer" filminden plastik cerrahi kızı Han Anran, birkaç günlük evlilikten sonra altı aylık hamile mi?
    Borgward "maratonu" tam rekoru yayınladı: Yang Song, yalnızca BBBA'yı terk ederek değil, markayı geri almayı tamamladı
    Gönül yarası! İPhone X'in merceği yanlışlıkla çıkarıldı. Netizenler izlemeyi bitirdi: Hayatımın geri kalanında kutuyu çıkarmayacağım
    Veri işlemenin ilerlemesini izlemek için pv komutunun nasıl kullanılacağını ayrıntılı olarak açıklayın
    Elektrikli ısıtma kışın çok pratik ama bazı önlemler var, doğru mu kullanıyorsunuz?
    Zhuo Wei, Huang Xiaoming'in boşanmasının açığa çıkmadığını bildirdi ve Yang Ying, oğluna dokunmayın dedi Aiko çok övüldü!
    Havalar soğuduğunda, telefon satın alma hevesi hoş olmaz, en çok satan 4 cep telefonu önerilir.
    Ultrasonik sensörlerin çalışma prensibi, özellikleri ve önlemleri! Dinamik grafik sunumunun anlaşılması kolaydır!
    iPhone8: Ben deliyim ve kimse anlayamaz!
    Zhang Xinyu saçlarını yaptırmak için dışarı çıktı ama güzellik salonlarının tüketimiyle ona hamilelik hakkında bilgi verildi. Bu popüler kişi kızgın olduğunu söyledi.
    Ölümcül Uber otopilot vakası: Donanım görüldü, yazılım yanıt vermemeye karar verdi
    Güç sistemi nasıl öğrenir? Sizi çeşitli elektrikli bileşenleri ve sembolleri anlamaya götürür! Bire bir yazışmaları anlamak kolaydır
    To Top