Bir veritabanında kaç satır ÇOK FAZLA?


87

1.000.000 kayıt içeren bir MySQL InnoDB tablom var. Bu çok mu fazla? Veya veritabanları bunu ve daha fazlasını halledebilir mi? Soruyorum çünkü bazı sorguların (örneğin, bir tablodan son satırı alma) 1 milyon satırlık tabloda 100'lü bir satıra göre daha yavaş (saniye) olduğunu fark ettim.

Yanıtlar:


114

1000000 yazmaçlı bir MySQL InnoDB masam var. Bu çok mu fazla?

Hayır, 1.000.000 satır (AKA kayıtları) bir veritabanı için çok fazla değil.

Soruyorum çünkü bazı sorguların (örneğin, bir tablonun son kaydını alma) 1 milyon yazmaçlı tablodaki 100 ile bire göre daha yavaş (saniye) olduğunu fark ettim.

Bu açıklamada hesaba katılması gereken çok şey var. Olağan şüpheliler:

  1. Kötü yazılmış sorgu
  2. Tabloda bir tane var olduğunu varsayarak birincil anahtar kullanmamak
  3. Kötü tasarlanmış veri modeli (tablo yapısı)
  4. Dizin eksikliği

4
5. Güncel olmayan sunucu özellikleri <Son çare.
Sneakyness

19
@Brimstedt: Ben de her zaman ismin "İndeksler" olması gerektiğini düşünmüştüm, ancak bunu veritabanları için kullanan birini hiç görmediğimi sanmıyorum: Wikipedia'dan: en.wikipedia.org/w/… Bay Coding Horror'a : codinghorror. com.tr / blog / archives / 000638.html . Konuyla ilgili şu ilginç SO gönderisi var: stackoverflow.com/questions/1001366 .
Daniel Vassallo

7
6. innodb'un çeşitli önbellekleri için yeterli bellek ayrılmamış
Jason

Daha iyi performans için PrimaryKey kullanmalı mıyım? Index, Unique gibi diğer anahtarları kullanmaya ne dersiniz? Bunları kullanabilir miyim? teşekkürler
user1844933

Belki bilgisayar, Jason'ın dediği gibi
hafızayla doludur

67

97.000.000'den fazla kayda ( 30GB veri dosyası ) sahip bir veritabanım var ve sorun yaşamıyorum .

Tablo dizininizi tanımlamayı ve geliştirmeyi unutmayın .

Dolayısıyla, 1.000.000'in çok olmadığı açıktır ! (Ama indekslemezseniz; evet, ÇOK SAYIDIR)


10
Bir sütuna bir "birincil anahtar" eklemek (otomatik artışı seçerek) indeksleme olur mu?
Nathan

8
@Nathan, aslında bir sütunu birincil anahtar olarak atadığınızda, otomatik olarak dizine alınır, ancak her tablonun yalnızca bir birincil anahtarı olabilir, eğer bir sütun için dizin eklemeniz gerekiyorsa, sorguları optimize etmek için bu stackoverflow.com/ a / 3002635/932473
dav

Tek trilyonlu tablom var ama IN LIFO format verilerini seçmek yavaş mı?
Saurabh Chandra Patel

Sorun yaşamamayı tanımlayın. En karmaşık sorgu ne kadar sürer? 100 milyon satırlık bir tablomuz var ve bir müşteri, hangi gruplama veya sıralama kriterlerini kullandıklarına bakılmaksızın, sorgularının en fazla 5 saniye içinde yapılmasını bekliyor. Dizinlerimiz iyileştirilebilir, ancak bir dizin eklemeye çalışan her şeyi kilitlemeden önce
Joe Yahchouchi

Üretim tablolarının% 20'sinde (eski bir çalışmaya göre) 1 milyondan fazla satır var. Birkaç milyar satırlık birkaç tane gördüm .
Rick James

19

Sorgunuzu incelemek ve sorgu planında herhangi bir sorun olup olmadığını görmek için "açıkla" yı kullanın.


6
Bu iyi bir fikir olsa da, bu cevabın kendisi bir acemiye vermek iyi değildir.
EXPLAIN'den

17
Sorguları incelemenize yardımcı olacak başka bir araç yok, bu yüzden öğrenmeye başlayın EXPLAIN- yeni başlayanlar olsun ya da olmasın.
no

30
birisi AÇIKLAYABİLİRSE iyi olurdu EXPLAIN;)
Jo E.


15

Bunun yaygın bir yanılgı olduğunu düşünüyorum - veritabanı ölçeklenebilirliği söz konusu olduğunda boyut denklemin yalnızca bir parçasıdır. Zor (veya daha zor) olan başka sorunlar da var:

  • Çalışma kümesi ne kadar büyüktür (yani belleğe ne kadar veri yüklenmesi ve üzerinde aktif olarak çalışılması gerektiği). Yalnızca veri eklerseniz ve onunla hiçbir şey yapmazsanız, aslında çözülmesi kolay bir sorundur.

  • Hangi düzeyde eşzamanlılık gereklidir? Ekleyen / okuyan tek bir kullanıcı mı var, yoksa aynı anda çalışan binlerce istemcimiz mi var?

  • Hangi düzeyde vaat / dayanıklılık ve performans tutarlılığı gereklidir? Her taahhüdü yerine getirebileceğimizden emin olmalı mıyız? Ortalama işlem hızlı mı, yoksa tüm işlemlerin güvenilir bir şekilde hızlı olduğundan emin olmak istiyor muyuz (altı sigma kalite kontrolü - http://www.mysqlperformanceblog.com/2010/06/07/performance-optimization- ve altı sigma / ).

  • ALTER tablo şeması gibi operasyonel sorunlar yapmanız gerekiyor mu? InnoDB'de bu mümkündür, ancak genellikle ön planda geçici bir tablo oluşturması gerektiğinden (tüm bağlantıları engelleyerek) inanılmaz derecede yavaştır.

Bu nedenle, sınırlayıcı iki konunun şöyle olacağını belirteceğim:

  • Sorgu yazma / iyi dizinlere sahip olma konusundaki kendi beceriniz.
  • ALTER TABLE ifadelerini beklerken ne kadar acı çekebilirsiniz.

2
Düzenleme: ALTER TABLE'ın geçici tablolar oluşturmasıyla ilgili tavsiyeler biraz eskimiştir. MySQL 5.5 hızlı bir dizin oluşturma özelliğine sahiptir ve 5.6 artık çevrimiçi DDL'ye sahiptir.
Morgan Tocker

3

1 milyon satırı kastediyorsanız, indekslemenizin nasıl yapıldığına ve donanımınızın yapılandırmasına bağlıdır. Bir milyon satır, bir kurumsal veritabanı için büyük bir miktar değildir, hatta düzgün ekipmanlarla ilgili bir geliştirme veritabanı için bile değildir.

1 milyon sütunu kastediyorsanız (MySQL'de bunun mümkün olduğundan bile emin değilseniz), o zaman evet, bu biraz büyük görünür ve muhtemelen sorunlara neden olur.


3

Kayıt ol? Kayıt mı demek istiyorsun?

Bugünlerde bir veritabanı için bir milyon kayıt çok önemli değil. Herhangi bir sorunla karşılaşırsanız, bu muhtemelen veritabanı sisteminin kendisi değil, üzerinde çalıştırdığınız donanımdır. Büyük olasılıkla, atacak donanımınız bitmeden önce DB ile ilgili bir sorunla karşılaşmayacaksınız.

Şimdi, belli ki bazı sorgular diğerlerinden daha yavaştır, ancak çok farklı zamanlarda iki çok benzer sorgu çalıştırılırsa, veritabanının yürütme planının ne olduğunu bulmanız ve bunun için optimize etmeniz, yani doğru dizinler, uygun normalleştirme vb. Kullanmanız gerekir.

Bu arada, bir tablodaki "son" kayıt diye bir şey yoktur, mantıksal açıdan bakıldığında, içsel bir sırası yoktur.


"SEÇ * TABLOSUNDAN SİPARİŞ KİMLİĞİNE GÖRE SIRALA 0"
Juanjo Conti

4
Belki SELECT LAST_INSERT_ID()o sorgu yerine ihtiyacın var .
True Soft

3

Analitik çalışma için kendi kendine birleştirilmiş birkaç milyar (dizine alınmış) kayda sahip bölümlenmemiş tablolar gördüm. Sonunda şeyi bölümlere ayırdık ama dürüst olmak gerekirse o kadar da fark görmedik.

Bununla birlikte, bu Oracle'daydı ve MySQL'de bu veri hacmini test etmedim. Dizinler senin dostun :)


2

"Kayıtlar" ile "kayıtları" kastettiğinizi varsayarsak, hayır, çok fazla değildir, MySQL gerçekten iyi ölçeklenir ve sabit diskinizde alanınız kadar kayıt tutabilir.

Açıkçası, arama sorguları daha yavaş olacak. Alanların düzgün bir şekilde dizine eklendiğinden emin olmaktan başka bir yolu yok.


2
Teknik olarak, tablonun boyutu, kullandığınız dosya sisteminin maksimum dosya boyutuyla da sınırlandırılabilir.
tster

0

Tablo ne kadar büyük olursa (içindeki daha fazla satırda olduğu gibi), dizin yoksa, genellikle daha yavaş sorgular çalışır. Doğru dizinleri eklediğinizde, sorgu performansınız artmalı veya en azından tablo büyüdükçe azalmamalıdır. Ancak, tablo büyüdükçe sorgunun kendisi daha fazla satır döndürürse, yeniden bozulma görmeye başlarsınız.

1M satır çok fazla olmasa da, DB sunucusunda ne kadar belleğiniz olduğuna da bağlıdır. Tablo sunucu tarafından belleğe alınamayacak kadar büyükse sorgular daha yavaş olacaktır.


0

Verileri sıralamak için sıralama birleştirme yöntemi kullanıldığından, sağlanan sorguyu kullanmak son derece yavaş olacaktır.

Tasarımı yeniden düşünmenizi tavsiye ederim, böylece onu geri almak için dizinler kullanıyorsunuz veya zaten bu şekilde sıralandığından emin olun, böylece hiçbir sıralama gerekmez.

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.