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'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.
İ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çinHer 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.
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
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 = utf82. 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.
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! !