MySQL'de "CREATE INDEX` Doğrusal Bir İşlem midir?


20

Demek istediğim şu:

nSatır içeren bir tabloda dizin oluşturmak tzaman alır . 1000*nYaklaşık bir 1000*tzaman ile aynı tabloda bir dizin oluşturur .

Ne elde etmeye çalışıyorum çok daha küçük test veritabanı aynı dizini oluşturarak üretim veritabanında dizin oluşturmak için gereken süreyi tahmin etmektir .

Yanıtlar:


16

Endeks yaratma esas olarak bir sıralama işlemidir , bu yüzden en iyi ihtimalle n log nortalama olarak siparişin büyüme karmaşıklığına sahiptir (bazı durumlarda daha iyi olduğunu görebilirsiniz ve çok daha kötü yapması muhtemel değildir).

İlgili tüm veri sayfalarınız RAM'a sığıyorsa ve zaten RAM'deyse ve dizin de sığacaksa ve DBMS'niz oluşturma işlemi tamamlanmadan dizin sayfalarını yazmaya zorlamaz (bu nedenle dizin blokları diskte birden çok kez güncelleştirilmez işlem), sonuçta elde edilen dizinin diske yazılma hızı, sıralamanın gerçekleştirilmesi için harcanan süreden daha önemli olacaktır - böylece satır sayısı ile dizin oluşturma süresinin doğrusal bir ilişkiye yaklaştığını görebilirsiniz. ancak daha kötü bir durum varsa, hoş olmayan bir şekilde şaşıracaksınız!

İşlem sırasında üretim veritabanına erişimi durduramayacağınız sürece, herhangi bir endeks yaratma IO bant genişliği için rekabet edemez ve / veya diğer faaliyetlerle kilitlenir, bu nedenle zamanlama tahmin testlerinizi yapıyorsanız bunu hesaba katmalısınız. aynı yapılandırılmış olsa bile başka bir sistemde.


7

Ayrıca, endekslerin iğlerini tablo için iğlerden ayırabiliyorsanız, bir seferde iki diskten çalışabileceksiniz (yine de ortadaki disk denetleyicisinin hızı ile sınırlı olabilir) bir RAID veya benzeri, ancak yine de bir diskten daha hızlı olacaktır).

Bir indeks oluşturmanın tamamen bir simul-read-write işlemi olmadığını, ancak işleri önemli ölçüde hızlandırdığını anlıyorum.

CAVEATS: Kendim bir MSSQL adamıyım ve bu yüzden MySQL hakkında emin değilim, ama iğleri bölme kavramının SQLServer ve Oracle'a özgü olmadığını hayal etmeliyim (burada da konuştuğumu duydum, IIRC ). Bu konsepti nasıl kuracağımı bilmiyordum. Ancak SQLServer terimleriyle, ayrı bir dosya PRIMARYgrubuna sahip olmak ve dizinleri diğer dosya grubuna koymak, diğer dosya grubunun dahil etmediği bir dizi PRIMARYiş miline atanması anlamına gelir (dosya gruplarına karşı iş mili yerleşimi verilmesi başka bir hikayedir)


1
Oracle'da hemen hemen aynı şey - sadece dosya gruplarına tablo alanı
Joe


1

Değişir.

Değişken # 1: MySQL, dizini anında oluşturmayı seçerse veya tüm veriler girilinceye kadar beklerse, dizini oluşturmak için bir sıralama vb. Yapın. Not: BENZERSİZ dizinler (sanırım) anında oluşturulmalıdır ki BENZERSİZLİK doğrulanabilir. InnoDB için PRIMARY KEY verilerle birlikte saklanır (ya da tam tersini söyleyebilirsiniz), bu yüzden rasgele oluşturulmalıdır ZORUNLU.

Değişken # 2: Dizin, verileri (örn. AUTO_INCREMENT veya zaman damgası) rastgele (GUID, MD5) veya aradaki bir yerde (parça numarası, ad, arkadaş_kimliği) izler.

Değişken # 3 (dizin anında oluşturulmuşsa): Dizin önbelleğe sığabilir (key_buffer veya innodb_buffer_pool) veya diske dökülebilir.

Verileri izleyen dizinler, # 1'in cevabından bağımsız olarak verimli ve neredeyse doğrusaldır.

Rastgele kimlikler bir acıdır. Dizin önbelleğe sığmazsa, diğer değişkenlerden bağımsız olarak dizini oluşturma süresi doğrusaldan çok daha kötü olacaktır. (Bu durumda Rolando ile aynı fikirde değilim.) PK için bir GUID ile büyük bir InnoDB tablo, sıradan diskler için 100 satır / sn plana INSERT için acı yavaş; SSD'leriniz varsa belki 1000. VERİ YÜKLEME ve toplu INSERT'ler rastgele depolamanın yavaşlığını geçmez.

3,53 ila 5,6 - pek bir şey değişmedi.

Birden fazla iğ? RAID şeritleme hemen hemen her durumda bunu buraya ve oraya manuel olarak atamaktan daha iyidir. Manuel bölme dengesiz durumlara yol açar - veri diskinde bir tablo taraması sıkışır; dizin diskinde salt dizin işlemi sıkıştı; yalnız bir sorgu önce dizin diskine, daha sonra veri diskine (çakışma olmaz) vurur; vb.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.