MySQL ön ekli dizini tanımlamanıza izin verir, bu da ilk N karakterini dizine eklenecek orijinal dizeden tanımladığınız anlamına gelir; ve püf noktası, iyi seçicilik sağlayacak kadar uzun, ancak yer kazanmak için yeterince kısa olan bir N sayısını seçmektir. Önek, dizini, tüm sütunu dizine ekleyebildiğiniz kadar kullanışlı hale getirmek için yeterince uzun olmalıdır.
Daha ileri gitmeden önce bazı önemli terimleri tanımlayalım. Dizin seçiciliği , toplam ayrı dizine alınmış değerlerin oranı ve toplam satır sayısıdır . Test tablosu için bir örnek:
+-----+-----------+
| id | value |
+-----+-----------+
| 1 | abc |
| 2 | abd |
| 3 | adg |
+-----+-----------+
Yalnızca ilk karakteri indekslersek (N = 1), indeks tablosu aşağıdaki tabloya benzeyecektir:
+---------------+-----------+
| indexedValue | rows |
+---------------+-----------+
| a | 1,2,3 |
+---------------+-----------+
Bu durumda, indeks seçiciliği IS = 1/3 = 0.33'e eşittir.
Dizine alınmış karakter sayısını ikiye çıkarırsak ne olacağını şimdi görelim (N = 2).
+---------------+-----------+
| indexedValue | rows |
+---------------+-----------+
| ab | 1,2 |
| ad | 3 |
+---------------+-----------+
Bu senaryoda IS = 2/3 = 0.66, bu da indeks seçiciliğimizi arttırdığımızı, ancak indeks boyutunu da arttırdığımızı gösteriyor. İşin püf noktası, azami endeks seçiciliği ile sonuçlanacak olan N sayısını bulmaktır .
Veritabanı tablonuz için hesaplamaları yapabileceğiniz iki yaklaşım vardır. Bu veri tabanı dökümü hakkında gösteri yapacağım .
Diyelim ki , masadaki çalışanların son soyadı için endeks sütununu eklemek istiyoruz ve en iyi endeks seçiciliğini üretecek en küçük N sayısını tanımlamak istiyoruz .
İlk önce en sık kullanılan soyadları tanımlayalım:
select count(*) as cnt, last_name from employees group by employees.last_name order by cnt
+-----+-------------+
| cnt | last_name |
+-----+-------------+
| 226 | Baba |
| 223 | Coorg |
| 223 | Gelosh |
| 222 | Farris |
| 222 | Sudbeck |
| 221 | Adachi |
| 220 | Osgood |
| 218 | Neiman |
| 218 | Mandell |
| 218 | Masada |
| 217 | Boudaillier |
| 217 | Wendorf |
| 216 | Pettis |
| 216 | Solares |
| 216 | Mahnke |
+-----+-------------+
15 rows in set (0.64 sec)
Gördüğünüz gibi, soyadı Baba en sık biridir. Şimdi en sık ortaya çıkan soyadı öneklerini beş harfli öneklerden başlayarak bulacağız .
+-----+--------+
| cnt | prefix |
+-----+--------+
| 794 | Schaa |
| 758 | Mande |
| 711 | Schwa |
| 562 | Angel |
| 561 | Gecse |
| 555 | Delgr |
| 550 | Berna |
| 547 | Peter |
| 543 | Cappe |
| 539 | Stran |
| 534 | Canna |
| 485 | Georg |
| 417 | Neima |
| 398 | Petti |
| 398 | Duclo |
+-----+--------+
15 rows in set (0.55 sec)
Her önekte çok daha fazla sonuç vardır, bu, N sayısının önceki örnektekilerle aynı olana kadar N sayısını arttırmamız gerektiği anlamına gelir.
N = 9 için sonuçlar
select count(*) as cnt, left(last_name,9) as prefix from employees group by prefix order by cnt desc limit 0,15;
+-----+-----------+
| cnt | prefix |
+-----+-----------+
| 336 | Schwartzb |
| 226 | Baba |
| 223 | Coorg |
| 223 | Gelosh |
| 222 | Sudbeck |
| 222 | Farris |
| 221 | Adachi |
| 220 | Osgood |
| 218 | Mandell |
| 218 | Neiman |
| 218 | Masada |
| 217 | Wendorf |
| 217 | Boudailli |
| 216 | Cummings |
| 216 | Pettis |
+-----+-----------+
İşte N = 10 için sonuçlar.
+-----+------------+
| cnt | prefix |
+-----+------------+
| 226 | Baba |
| 223 | Coorg |
| 223 | Gelosh |
| 222 | Sudbeck |
| 222 | Farris |
| 221 | Adachi |
| 220 | Osgood |
| 218 | Mandell |
| 218 | Neiman |
| 218 | Masada |
| 217 | Wendorf |
| 217 | Boudaillie |
| 216 | Cummings |
| 216 | Pettis |
| 216 | Solares |
+-----+------------+
15 rows in set (0.56 sec)
Bu çok iyi sonuçlar. Bu, yalnızca ilk 10 karakteri indeksleyerek son soyadı sütununda indeks yapabileceğimiz anlamına gelir . Tablo tanımı sütununda last_name , olarak tanımlanır VARCHAR(16)
ve bu, giriş başına 6 bayt (veya soyadı UTF8 karakterleri varsa) kaydettiğimiz anlamına gelir. Bu tabloda 6 bayt ile çarpılan 1637 farklı değer var, yaklaşık 9KB ve tablomuz milyon satır içeriyorsa bu sayının nasıl artacağını hayal edin.
Sen sayısını hesaplarken başka yollarını okuyabilir N mesajımın içinde MySQL öneki endeksler .
Dizine alınması gereken değerleri üretmek için MD5 ve SHA1 işlevlerini kullanmak da iyi bir yaklaşım değildir . Neden? Yazıyı oku MySQL veritabanında birincil anahtar için doğru veri türü nasıl seçilir