MySQL BLOB
, içerdikleri veriler çok büyük olabileceğinden ve dolaylı olarak DB dizini büyük olacağından, dizinten fayda sağlamayacağı için tam bir değer TEXT
ve uzun VARCHAR
sütunların dizine eklenmesine izin vermez .
MySQL, dizine eklenecek ilk N karakterleri tanımlamanızı gerektirir ve hile, iyi seçicilik sağlayacak kadar uzun, ancak yerden tasarruf edecek kadar kısa bir N sayısı seçmektir. Ön ek, dizini, tüm sütunu dizine eklediğinizde olabildiğince kullanışlı hale getirecek kadar uzun olmalıdır.
Daha ileri gitmeden önce bazı önemli terimleri tanımlayalım. Dizin seçiciliği , toplam farklı dizinlenmiş değerlerin ve toplam satır sayısının oranıdır . Test tablosu için bir örnek:
+-----+-----------+
| id | value |
+-----+-----------+
| 1 | abc |
| 2 | abd |
| 3 | adg |
+-----+-----------+
Yalnızca ilk karakteri dizine alırsak (N = 1), dizin tablosu aşağıdaki tabloya benzer:
+---------------+-----------+
| indexedValue | rows |
+---------------+-----------+
| a | 1,2,3 |
+---------------+-----------+
Bu durumda, dizin seçiciliği IS = 1/3 = 0.33'e eşittir.
Şimdi dizine eklenen karakter sayısını ikiye (N = 2) çıkarırsak ne olacağını görelim.
+---------------+-----------+
| indexedValue | rows |
+---------------+-----------+
| ab | 1,2 |
| ad | 3 |
+---------------+-----------+
Bu senaryoda IS = 2/3 = 0.66, yani endeks seçiciliğini artırdık, fakat endeks boyutunu da arttırdık. Hile, maksimum dizin seçiciliği ile sonuçlanacak minimum N sayısını bulmaktır .
Veritabanı tablonuz için hesaplamalar yapabileceğiniz iki yaklaşım vardır. Bu veritabanı dökümü üzerinde gösteri yapacak .
Diyelim ki tablo çalışanlarına last_name sütununu dizine eklemek istiyoruz ve en iyi dizin seçiciliğini sağlayacak 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 kullanılanı. Şimdi beş harfli öneklerden başlayarak en sık karşılaşılan soyadı öneklerini 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 önekin çok daha fazla örneği vardır, bu da değerler önceki örnekteki ile hemen hemen aynı olana kadar N sayısını artırmamız gerektiği anlamına gelir.
İşte 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, last_name
yalnızca ilk 10 karakteri dizine ekleyerek sütunda dizin oluşturabileceğ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ında UTF8 karakterleri varsa daha fazla) kaydettiğimiz anlamına gelir. Bu tabloda, 6 bayt ile çarpılan yaklaşık 1637 farklı değer vardır ve yaklaşık 9KB'dir ve tablonuzda milyon satır varsa bu sayının nasıl büyüyeceğini hayal edin.
Sen sayısını hesaplarken başka yollarını okuyabilir N mesajımın içinde MySQL öneki endeksler .
UNIQUE
anahtara sahip olduğu anlamına mı geliyor?