Veri okumaları için MyISAM


10

Yaklaşık 1 Milyar sıralı bir masam var ve% 98'i yoğun okuyor.

Veritabanını farklı depolama motorlarıyla (MyISAM ve InnoDB) ayarlamayı denedim

Sonra performansı görmek için birkaç test yaptık

Burada, birincil anahtar kimliğim vardı ve MyISAM Anahtar Önbelleği tüm dizini arabelleğine yüklediğinden, MyISAM kullanarak oldukça hızlı, InnoDB'den yaklaşık 2 kat daha hızlı görünüyordu

Ama InnoDB için, daha yavaş gibiydi !! InnoDB dizinleri önceden yüklemek için herhangi bir arabellek kullanmıyor mu?


belki soruyu kapatmak için oy kullanan mutlu moderatörler motivasyonlarını detaylandırabilir mi?
pQd

Söz konusu veritabanının ve tablonun boyutu hakkında bize biraz fikir verebilir misiniz? Diskteki toplam boyut yararlı olacaktır. Ayrıca, üzerinde çalıştığınız makine hangi özelliklere sahiptir?
Dave Rix

Yanıtlar:


6

MyISAM veya InnoDB'ye karar vermeden önce, her bir Depolama Motoruna her bir önbelleğin nasıl

MyISAM

Okunduğunda, bir MyISAM tablosunun dizinleri .MYI dosyasından bir kez okunabilir ve MyISAM Anahtar Önbelleğine yüklenebilir ( key_buffer_size boyutunda ). Bir MyISAM tablosunun .MYD'sini daha hızlı okumayı nasıl sağlayabilirsiniz? Bununla:

ALTER TABLE mytable ROW_FORMAT=Fixed;

Bunu geçmiş yayınlarımda yazdım

InnoDB'nin

Tamam, InnoDB ne olacak? InnoDB, sorgular için disk G / Ç yapıyor mu? Şaşırtıcı, evet öyle !! Muhtemelen bunu söylediğim için deli olduğumu düşünüyorsunuz, ancak SELECT sorguları için bile kesinlikle doğrudur . Bu noktada, muhtemelen "InnoDB, sorgular için disk G / Ç işlemlerini nasıl yapıyor?"

Her şey, InnoDB'nin bir ACID uyumlu İşlemsel Depolama Motoru olduğuna geri dönüyor . İşlemsel olmak InnoDb için, bu desteklemek zorundadır Iin ACIDİzolasyon olduğunu. İşlemler için izolasyonu koruma tekniği MVCC, Multiversion Concurrency Control ile yapılır . Basit bir ifadeyle, InnoDB, işlemler bunları değiştirmeye çalışmadan önce verilerin neye benzediğini kaydeder. Bu nereye kaydediliyor? Sistem tablo alanı dosyasında ibdata1 olarak bilinir. Bu, disk G / Ç gerektirir .

KARŞILAŞTIRMA

Hem InnoDB hem de MyISAM disk G / Ç işlemlerini gerçekleştirdiğinden, hangi rasgele faktörler kimin daha hızlı olduğunu belirler?

  • Sütunların Boyutu
  • Sütun Biçimi
  • Karakter Setleri
  • Sayısal Değerler Aralığı (yeterince büyük INT gerektirir)
  • Satırlar Bloklar Arasında Bölünüyor (Satır Zinciri)
  • DELETEsVe tarafından neden olunan Veri ParçasıUPDATEs
  • Birincil Anahtarın Boyutu (InnoDB, iki anahtar arama gerektiren bir Kümelenmiş Dizine sahiptir)
  • Endeks Girişlerinin Boyutu
  • liste devam ediyor...

SONSÖZ

Bu nedenle, çok okunan bir ortamda, sabit davranış biçimine sahip bir MyISAM tablosunun, işlemsel davranışı desteklemek için ibdata1 içinde bulunan geri alma günlüklerine yazılan yeterli veri varsa InnoDB'nin InnoDB okuma havuzundan daha iyi performans göstermesi mümkündür. InnoDB verilerine dayatılmıştır. Veri türlerinizi, sorgularınızı ve depolama motorunuzu dikkatlice planlayın. Veriler büyüdükten sonra, verileri taşımak çok zor olabilir.

Bu arada, 5 gün önce böyle bir şey yazdım: mySQL için nasıl bir bellek sınırı atayabilirim?


innodbe gerçekten tüm veriler zaten tampon havuzunda ve herhangi bir eşzamanlı veri değişiklik istekleri yok, sadece okur, herhangi bir disk okuma oluşturur?
pQd

Benim tahminim, asker db'sinde 1 milyar satır olduğu için, o zaman tüm arabellek havuzunda RAM'de önbelleğe alınma olasılığı düşüktür - bu nedenle tampon havuzunun ve diskin dışındaki verilere ulaşmak için gerekli okumalar olacaktır?
Dave Rix

3

Veriler için çekişme olmadığında MyISAM her zaman innodb'den çok daha hızlı çalışacaktır. Aynı tabloyu güncellemeye çalışan birden çok oturum eklemeye başlayın ve innodb çok hızlı bir şekilde performans avantajı elde eder.

Sistemi 2 motor için nasıl ayarladığınız çok farklı.

Farklı motorların var olmasının nedeni, farklı iş yükleri / erişim kalıplarının mevcut olmasıdır.


2

innodb'u 'ısıtmak' zorundasınız. erişim günlüklerini yeniden oynatarak veya dizindeki her değere dokunacak bazı akıllı sorgular çalıştırarak.

buraya veya buraya bir göz atın .

Ben innodb için varsayılan mysql ayarlarını kullanmıyorum umuyoruz - onlar ~ 2000 donanım için uygundur.


Varsayılan yapılandırmada değişiklikler yaptım, aynı zamanda sorguyu birkaç kez, yaklaşık 30 kez çalıştırdım, ancak neredeyse aynı sonuçları ürettim. Birkaç denemeden sonra daha hızlıydı, ancak MYISAM'dan daha yavaş kaldı, ayrıca MariaDB'yi de kullandı (en son sürüm)
Akash


0

InnoDB'yi MariaDB üzerinde daha fazla ayarladıktan sonra, innodb_buffer_pool_sizeInnoDB veritabanı boyutumu artırdım , çünkü bunu yaptığınızda InnoDB satırları daha hızlı almaya başladı

InnoDB ayarının veritabanı ihtiyaçlarınıza göre oldukça önemli olduğunu düşünüyorum

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.