Drupal veritabanı innodb veya MyISAM?


10

Drupal sitem var ve performans sorunları yaşıyorum. Nasıl bir veritabanı MyISAM InnoDB dönüştürmek nasıl buldum ? performansın anahtarlama ile gelişebileceğini gösterir.

MySQL veritabanımın InnoDB mi, yoksa MyISAM mı olduğunu nasıl anlayabilirim?


1
Tablo türü kataloğa bağlı değil. İçinde MyISAM ve InnoDB tablolarının bir karışımını içeren bir kataloğunuz olabilir.
mpdonadio

2
Bu düzeyde optimizasyonların faydaları olsa da, tablo türlerini değiştirmenin performans sorunlarınızı çözeceğinden şüpheliyim. Aradaki fark o kadar da büyük değil.
Letharion

1
@Chris J. Lee, bu doğru. Karıştırma tablosu türleri performans nedeniyle veya yalnızca belirli bir tablo türü için kullanılabilen özelliklerden (örneğin, MyISAM tablolarıyla FULLTEXT araması) yararlanmak için kullanılabilir. Ayrıca, mysqld varsayılanlarını değiştirir ve bir katalogda daha fazla tablo oluşturursanız, kazara da olabilir :)
mpdonadio

2
Letharion: bu sadece yanlış. Tablo türleri ve mysql'in onlar için yapılandırılma şekli performans üzerinde büyük bir etkiye sahiptir!
Walter Heck

2
@Letharion: Aslında, mimari iyileştirmeleri bir kenara bırakarak, karışık SELECT'ler ve UPDATE'lerle eşzamanlılık gibi durumlarda çok büyük performans kazanımları - bir UPDATE MyISAM'da bir tabloyu kilitleyecek, ancak InnoDB'de sadece bir satır - büyük performans artışlarının bir tablonun motorunu değiştirmekten başka bir şey olmadan görülmek. Şimdi, aptalca bir sorgu yapıyorsanız, aptalca bir sorgu yapıyorsunuz ve tablo türlerini değiştirmek yardımcı olmaz. Ancak motorları değiştirmenin elden çıkarılması aynı derecede yanlıştır.
BMDan

Yanıtlar:


8

Özel bir sorgu çalıştırabilirsiniz:

SELECT TABLE_NAME, ENGINE
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'database_name'

veritabanınızdaki tüm tabloları ve her biri için kullanılan motoru listeler.

Alternatif olarak phpMyAdmin'i kullanarak veritabanınıza giriş yapabilir ve veritabanınızı seçebilirsiniz ... Typetablo listesindeki sütunda motoru görürsünüz .

Şahsen MySQL için Navicat tavsiye ederim , çok güzel bir MySQL GUI ve böyle şeyler bulmayı çok kolay hale getirir.

Kaynak: http://www.electrictoolbox.com/mysql-table-storage-engine/


Eski MySQL Yönetici aracı da böyle şeyler için iyi çalışır. MySQL web sitesinde dolaşırsanız, yükleyiciyi hala bulabilirsiniz.
mpdonadio

@MPD Wow hala devam ediyor mu? Sadece biraz nostalji için bile olsa indirmelisiniz :)
Clive

Yönetici ve Sorgu Tarayıcısı artık resmi olarak kullanımdan kaldırıldı ve desteklenmiyor, ancak yine de indirebilirsiniz. Workbench'ten nefret ediyorum ve hala kullanıyorum.
mpdonadio

Komut satırında phpMyAdmin'de gördüklerinize benzer çıktıları görmek için kullanın SHOW TABLE STATUS. Her motor tipinde kaç tablonun olduğunu basit bir şekilde hesaplamak için SELECT ENGINE,COUNT(TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_SCHEMA='database_name' GROUP BY ENGINE.
BMDan

6

Benim en iyi deneyim, tablo başına karar vermek oldu. InnoDB güzeldir, çünkü tablo kilitlemesini önleyebilir (bir işlem yazarken tablodan başka bir işlem okunamaz), ancak çağrı cihazı sorguları için sıklıkla kullanılan COUNT () ile çok iyi performans gösterir.

(Düzenle: lütfen aşağıdaki Clives yorumuna bakın)

Kullandığınız DB'ye bağlı olarak MySQL kurulumunuzda da bazı etkiler vardır. Sunucuya erişiminiz varsa, yapılandırmayı kontrol etmek için ilk adımınız mysqltuner olmalıdır:

https://github.com/rackerhacker/MySQLTuner-perl#readme


2
1 I InnoDB'nin için yavaş bilmiyordum COUNTgöre, sorgular MySQL için eski Yüksek Performanslı Grup yöneticisi tarafından bu makalede sadece gerçekten içeren bir sorgu etkiler olsa COUNT(*) olmadan bir WHEREmaddede.
Clive

3
Bunun nedeni, MyISAM'ın tablodaki satır sayısı için tablo başına bir değer tutmasıdır, yani basit bir SELECT COUNT(*) FROM tabledeğer bu değerle anında geri dönebilir. InnoDB yapmaz, bu nedenle tüm birincil anahtar dizinini taramalıdır. Bununla birlikte, Drupal çok şey yaparken SELECT COUNT(*), tüm kodda sadece bir WHEREmadde olmadan bunu yapan bir yer düşünebilirim . Bu nedenle, MyISAM'i bu özel edgekaz için endişe duymadan kullanmayın. İyi bir boyut tampon havuzuna sahip InnoDB, tüm gerçek dünya sorguları için daha hızlı olacaktır.
BMDan

6

Sadece bir web sitesi daha hızlı almak için şeyler denemek körü körüne değişen araba gibi ve bir dahaki sefere daha hızlı bir olsun umuyoruz.

Önce düşük asılı meyveleri deneyin, eğer yardımcı olmazsa, gerçek darboğazı bulmaya çalışın.

  1. Yerleşik mekanizmaları açtınız mı: sayfa önbelleğe alma (yalnızca anonim kullanıcılar için geçerlidir), CSS ve JS anlaşması?
  2. Ana makineniz APC gibi bir opcode önbellek sunuyorsa açın.
  3. Drupal'ınızı tam DB dahil yerel olarak ayarlayın.
  4. XDebug'un çalıştığından emin olun.
  5. Gerçek performans profili oluşturmaya başlayın. Bu şekilde web sitenizin hangi bölümünün çok fazla zaman harcadığını belirleyebilirsiniz. Web siteniz ne kadar yavaşsa, suçlu kodunu / bileşenini bulmak o kadar kolay olur.

Genellikle sadece bir indeks gerektiren yavaş bir DB sorgusu ya da işleri yavaş bir şekilde yapan bir modül.

Ev sahipleri arasında büyük farklılıklar da keşfettim. Kutudan yeni bir drupal takarsanız, performans iyi mi? Değilse, başka bir barındırma zamanı.


5

FWIW neredeyse 20K düğümü Drupal 6.x sitemizde bazı performans sorunları yaşıyordu ve tüm tabloları InnoDB'ye taşımayı seçtim. Kolaydı ve işlediğim şekilde, tüm içeriği bir sql dosyasına dökmek için mysqldump kullanmak, MyISAM'ın tüm oluşumlarını InnoDB'ye değiştirmek için bir düzenleyici (sed) kullanmak ve veritabanını bu dosyadan yeniden yüklemekti. Aşağı taraflardan biri, InnoDB veritabanından (IIRC) alan kurtaramazsınız, ancak yinelenen tablolarınızı ayrı bir DB'de tuttuğunuz sürece sorun yaşamayacaksınız. Oh, ve önemli bir performans artışı gördük. Dört Drupal örneğimiz olduğu için, çok sayıda tablo dosyası dosya sisteminden kaldırıldı (evet, InnoDB dosyasının içinde yer alıyorlar). Bu benim 0,02 dolarým.


2
Tek bir InnoDB tablo alanına sahip olmak, inode'ları kurtarabilir, ancak (kendinizden bahsettiğiniz gibi) disk alanı pahasına. Çok fazla veri silseniz bile, bu disk alanını geri alamazsınız. Bu da gereksiz büyük yedekleme dosyalarına ve tek tabloları geri yükleyememeye neden olur. Bu yüzden innodb_file_per_tableseçeneği kullanmayı tercih ediyorum .
geewiz

1
Ayrıca, yerinde tabloları dönüştürebilirsiniz: for tbl in $(mysql -Ne 'show tables' databasename); do mysql -e "ALTER TABLE $tbl ENGINE=InnoDB"; done. Gerekirse -uroot -psomepassiki mysqls'ye uygun seçenekler ekleyin ( örneğin) .
BMDan

5

Sadece aklınızda bulunsun. Drupal 6'daysanız , DBTuner modülünü kurabilirsiniz ; tablolarınızı MyISAM'den InnoDB'ye kolayca taşıyabilir. Evet, bunun için bir modül var!

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.