MyISAM'den InnoDB'ye dönüştürme özelliği olan var mı?


11

MyISAM'den InnoDB'ye geçmeye hazırım ama aranacak şeylerin tam bir listesi olup olmadığını bilmek mi istiyorsunuz? Örneğin, DISABLE KEYSbir InnoDB tablosunda çalıştırmanın , manuel sayfa haricinde bir uyarı vereceğini belirten bir liste görmedim ALTER TABLE. Dönüştürmeden önce bilmem gereken bu tür bir şey. Sorgularımla iyi olacağını düşündüm ama görünüşe göre değil.

Yanıtlar:


7

İşte bazı yakalamalar

Hafıza kullanımı

MyISAM

InnoDB'nin

  • veri sayfalarını ve dizin sayfalarını önbelleğe alır.
  • MySQL 5.5'ten önce bir tampon havuzu ve bir boyut
  • MySQL 5.5 ile başlayan 1 veya daha fazla tampon havuzu

MyISAM Anahtar Önbelleği ve InnoDB Arabellek Havuzu için uygun bir boyutun nasıl seçileceğiyle ilgili daha önce yazdığım ve gönderdiğim bazı sorgular .

FULLTEXT Dizinleri

MyISAM

  • FULLTEXT dizinlerini destekler

InnoDB'nin

MySQL 5.5 ve geri

Hangi MyISAM tablolarının FULLTEXT dizinine sahip olduğunu bulmak için şu sorguyu çalıştırın:

select tbl.table_schema,tbl.table_name from
(
    select table_schema,table_name
    from information_schema.tables
    where engine='MyISAM'
    and table_schema NOT IN ('information_schema','mysql')
) tbl
INNER JOIN
(
    select table_schema,table_name
    from information_schema.statistics
    where index_type='FULLTEXT'
) ndx
USING (table_schema,table_name);

Bu sorgudan çıkan her şey, MySQL 5.6 sürümüne yükseltilene kadar InnoDB'ye dönüştürülemez.

OPTİMİZE TABLOSU

MyISAM

  • MyISAM tablosu küçüldü
  • ANALYZE TABLE dizin istatistiklerini tüm dizinlerde çalıştırır

InnoDB'nin


Sorgu için teşekkürler, küçük yazım hatası olsa: "motor" yerine "engin"
Andrew

@RolandoMySQLDBA: InnoDB'nin mekansal indeksleri olmadığını ekleyebilirsiniz.
ypercubeᵀᴹ

2

Bence en büyük gotcha işlemsel olmak innodb etrafında olurdu. Uygulamalarınız tarafından kullanılan MySQL kitaplıklarının varsayılan olarak auto_commit olup olmadığını bilmek isteyeceksiniz.

Örneğin Python otomatik olarak taahhütte bulunmaz. Bu, bir uygulama bağlantısını kapatmadan hemen önce bir satır ekliyorsa, innodb'a geçtikten sonra artık ekin geri alınacağı anlamına gelir. Örneğin python komut dosyasının connection.commit () öğesini çağırdığınızdan emin olmanız gerekir.

Başka bir fark noktası, çok satırlı ekler veya güncellemeler etrafında olabilir. Çok satırlı tek bir ekleme düşünün

insert into tbl values (...row1...),  (...row2...),  (...rowN....);

Sıra3'te benzersiz bir anahtar çarpışması gibi bir hata varsa ne olacağını düşünün. MyISAM ile ilk iki satır yazılır, innodb altında yazılan tüm satırlar geri alınır ve böyle bir hata bile yazılan hiçbir şey kalmaz.

Innodb ile kilitlenme dünyasına gireceksiniz. Bunlar, herhangi bir işin yapılmasını önlemek için böyle bir sıklıkta meydana gelmedikleri sürece doğal olarak kötü değildir. Bununla birlikte, uygulamalarınızın kilitlenmeleri önleyecek ve uygun şekilde işleyecekleri şekilde kodlanması gerekecektir (büyük olasılıkla sadece yeniden denemek anlamına gelir).

Bellek / depolama sınırlamalarını göz önünde bulundurun. Innodb, MyISAM'dan çok daha kaynak yoğun. Tampon havuzlarınızı tüm masalarınızı barındıracak kadar büyük tutmak için yeterli RAM'iniz varsa altınsınız.

Büyük birincil anahtarları olan tabloları arayın. Innodb'un kümelenmiş dizinlemesi, her ikincil dizinin karşılık gelen satırın PK'sının başka bir kopyasını tuttuğu anlamına gelir. 2 ikincil dizininiz varsa, bu, her PK sırası 3 kez (PK + her dizin) depolandığı anlamına gelir. Pk birkaç sütuna ve büyük veri türlerine (örneğin char (N)) yayılıyorsa, indeks gereksinimlerinin innodb altında nasıl hızlı bir şekilde patlayabileceğini görebilirsiniz.

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.