Adakah gotcha sama sekali dengan mengkonversi dari MyISAM ke InnoDB?

11

Saya siap pindah dari MyISAM ke InnoDB tetapi ingin tahu apakah ada daftar lengkap hal yang harus dicari? Misalnya, saya belum melihat daftar yang menyebutkan bahwa menjalankan DISABLE KEYStabel InnoDB akan memberikan peringatan, kecuali halaman manual untuk ALTER TABLE. Itu hal yang perlu saya ketahui sebelum bertobat. Saya pikir saya akan baik-baik saja dengan pertanyaan saya tetapi ternyata tidak.

Andrew
sumber

Jawaban:

7

Inilah beberapa gotcha

Penggunaan Memori

MyISAM

InnoDB

  • cache halaman data dan halaman indeks.
  • satu buffer pool dan satu ukuran sebelum MySQL 5.5
  • 1 atau lebih buffer pool dimulai dengan MySQL 5.5

Berikut adalah beberapa pertanyaan yang saya tulis dan posting sebelumnya tentang cara memilih ukuran yang tepat untuk Cache Kunci MyISAM dan InnoDB Buffer Pool .

Indeks FULLTEXT

MyISAM

  • Mendukung indeks FULLTEXT

InnoDB

  • Dimulai dengan MySQL 5.6, ya, tetapi masih dalam versi beta (UPDATE: MySQL 5.6 ada dan memiliki indeks FULLTEXT. Jika Anda menggunakan pengindeksan FULLTEXT di MySQL 5.6, pastikan Anda menggunakan opsi FULLTEXT khusus InnoDB )
  • Sebelum MySQL 5.6, ini berarti Anda tidak dapat mengonversi MyISAM ke InnoDB.

MySQL 5.5 dan kembali

Untuk menemukan tabel MyISAM mana yang memiliki indeks FULLTEXT jalankan kueri ini:

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);

Apa pun yang keluar dari kueri ini tidak dapat dikonversi ke InnoDB sampai Anda memutakhirkan ke MySQL 5.6.

MENGOPTIMALKAN TABEL

MyISAM

  • Tabel MyISAM menyusut
  • TABEL ANALISIS menjalankan statistik indeks pada semua indeks

InnoDB

RolandoMySQLDBA
sumber
Terima kasih atas pertanyaannya, kesalahan ketik kecil: "engin" bukannya "engine"
Andrew
@RolandoMySQLDBA: Anda dapat menambahkan bahwa InnoDB tidak memiliki indeks spasial.
ypercubeᵀᴹ
2

Saya pikir gotcha terbesar akan sekitar innodb menjadi transaksional. Anda akan ingin tahu apakah pustaka MySQL digunakan oleh aplikasi Anda auto_commit secara default atau tidak.

Python , misalnya, tidak otomatis melakukan. Ini berarti jika suatu aplikasi menyisipkan baris tepat sebelum menutup koneksi itu, sisipan itu sekarang akan diputar kembali setelah Anda mengubah ke innodb. Skrip python misalnya perlu memastikan untuk memanggil connection.commit ();

Titik perbedaan lain bisa sekitar insert atau pembaruan multi baris. Pertimbangkan inser multi baris tunggal

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

Pertimbangkan apa yang terjadi jika ada beberapa jenis kesalahan seperti tabrakan kunci unik pada baris3. Dengan MyISAM, dua baris pertama akan ditulis, di bawah innodb semua baris yang dituliskan akan dibatalkan tanpa meninggalkan apa pun yang ditulis dalam kesalahan seperti itu.

Dengan innodb Anda akan memasuki dunia deadlock. Ini tidak secara inheren buruk kecuali mereka terjadi dengan frekuensi seperti itu untuk mencegah pekerjaan dilakukan. Namun aplikasi Anda perlu dikodekan sedemikian rupa sehingga mereka mengantisipasi kebuntuan dan menanganinya dengan tepat (yang kemungkinan besar berarti coba lagi).

Pertimbangkan keterbatasan memori / penyimpanan. Innodb jauh lebih banyak sumber daya daripada MyISAM. Jika Anda memiliki RAM yang cukup untuk menjaga kolam penyangga Anda cukup besar untuk mengakomodasi semua tabel Anda, maka Anda adalah yang terbaik.

Cari tabel yang memiliki kunci utama besar. Pengindeksan berkelompok Innodb berarti setiap indeks sekunder memiliki salinan PK baris yang sesuai. Jika Anda memiliki 2 indeks sekunder, itu artinya setiap baris PK disimpan 3 kali (PK + setiap indeks). Jika pk membentang di beberapa kolom dan tipe data besar (char (N) misalnya) Anda dapat melihat bagaimana persyaratan indeks dapat dengan cepat meledak di bawah innodb.

atxdba
sumber