MyISAM untuk membaca data

10

Saya punya meja dengan sekitar 1 Miliar baris, dan 98% bacanya intensif.

Saya mencoba menyetel basis data, dengan mesin penyimpanan yang berbeda (MyISAM dan InnoDB)

Kemudian jalankan beberapa tes untuk melihat kinerja

Di klausa mana saya memiliki ID kunci utama, dan sepertinya sejak MyISAM Key Cache menyimpan semua indeks dalam buffernya, menggunakan MyISAM tampaknya cukup cepat, sekitar 2 kali lebih cepat daripada InnoDB

Tapi untuk InnoDB, sepertinya lebih lambat !! Apakah InnoDB tidak menggunakan buffer apa pun untuk memuat indeks?

Akash
sumber
mungkin salah satu pemicu senang moderator memberikan suara untuk menutup pertanyaan dapat menguraikan motivasi mereka?
pQd
Bisakah Anda memberi kami gambaran tentang ukuran database dan tabel yang dimaksud? Ukuran total pada disk akan berguna. Selain itu, spek apa yang sedang Anda jalankan?
Dave Rix

Jawaban:

6

Sebelum Anda memutuskan MyISAM atau InnoDB, Anda harus memeriksa kedua Mesin Penyimpanan dalam hal bagaimana masing-masing cache

MyISAM

Saat membaca, indeks tabel MyISAM dapat dibaca sekali dari file .MYI dan dimuat di Cache Kunci MyISAM (sesuai ukuran dengan key_buffer_size ). Bagaimana Anda bisa membuat .MYD tabel MyISAM lebih cepat untuk dibaca? Dengan ini:

ALTER TABLE mytable ROW_FORMAT=Fixed;

Saya menulis tentang ini di posting saya sebelumnya

InnoDB

OK, bagaimana dengan InnoDB? Apakah InnoDB melakukan disk I / O untuk permintaan? Anehnya, ya itu benar !! Anda mungkin berpikir saya gila karena mengatakan itu, tetapi itu benar-benar benar, bahkan untuk pertanyaan SELECT . Pada titik ini, Anda mungkin bertanya-tanya "Bagaimana mungkin InnoDB melakukan disk I / O untuk permintaan?"

Semuanya kembali ke InnoDB menjadi Mesin Penyimpanan Transaksional ACID -complaint. Agar InnoDB menjadi Transaksional, ia harus mendukung Iin ACID, yaitu Isolasi. Teknik untuk menjaga isolasi untuk transaksi dilakukan melalui MVCC, Multiversion Concurrency Control . Secara sederhana, InnoDB mencatat data seperti apa sebelum transaksi mencoba mengubahnya. Di mana itu direkam? Dalam file tablespace sistem, lebih dikenal sebagai ibdata1. Yang membutuhkan disk I / O .

PERBANDINGAN

Karena InnoDB dan MyISAM melakukan disk I / O, faktor acak apa yang menentukan siapa yang lebih cepat?

  • Ukuran Kolom
  • Format kolom
  • Set Karakter
  • Rentang Nilai Numerik (membutuhkan INT yang cukup besar)
  • Baris Sedang Dipisah Melintasi Blok (Row Chaining)
  • Fragmentasi data yang disebabkan oleh DELETEsdanUPDATEs
  • Ukuran Kunci Utama (InnoDB memiliki Indeks Berkelompok, membutuhkan dua pencarian kunci)
  • Ukuran Entri Indeks
  • daftar berjalan ...

EPILOG

Dengan demikian, dalam lingkungan yang banyak dibaca, dimungkinkan untuk tabel MyISAM dengan Format Baris Tetap untuk mengungguli InnoDB membaca dari Pool Buffer InnoDB jika ada cukup data yang ditulis ke dalam undo log yang terkandung dalam ibdata1 untuk mendukung perilaku transaksional dikenakan pada data InnoDB. Rencanakan tipe data, kueri, dan mesin penyimpanan Anda dengan saksama. Setelah data tumbuh, mungkin akan sangat sulit untuk memindahkan data.

Ngomong-ngomong, saya menulis sesuatu seperti ini 5 hari yang lalu: Bagaimana cara menetapkan batas memori untuk mySQL?

RolandoMySQLDBA
sumber
Apakah innodbe benar-benar menghasilkan disk membaca ketika semua data sudah ada di buffer pool dan tidak ada permintaan modifikasi data bersamaan, hanya membaca?
pQd
Dugaan saya adalah karena penanya memiliki 1 miliar baris di db, maka ia tidak mungkin memiliki semuanya di-cache dalam RAM di buffer pool - maka akan ada bacaan yang diperlukan untuk mendapatkan data di luar buffer pool dan pada disk?
Dave Rix
3

MyISAM akan selalu berjalan jauh lebih cepat daripada innodb ketika tidak ada pertentangan untuk data. Mulailah menambahkan beberapa sesi dengan mencoba memperbarui tab yang sama, dan innodb dengan sangat cepat mendapatkan keunggulan kinerja.

Bagaimana Anda menyetel sistem untuk 2 mesin sangat berbeda.

Alasan mengapa ada mesin yang berbeda adalah karena beban kerja / pola akses yang berbeda ada.

symcbean
sumber
2

Anda harus 'menghangatkan' Innodb. misalnya dengan memainkan kembali log akses atau menjalankan beberapa kueri pintar yang akan menyentuh setiap nilai dari indeks.

lihat di sini atau di sini .

Saya harap Anda tidak menggunakan pengaturan mysql default untuk innodb - mereka cocok untuk perangkat keras dari ~ 2000.

pQd
sumber
Saya memang membuat perubahan dalam konfigurasi default, juga menjalankan kueri beberapa kali, sekitar 30 kali, tetapi menghasilkan hasil yang hampir sama. Itu lebih cepat setelah beberapa kali mencoba, tetapi tetap lebih lambat dari MYISAM, juga menggunakan MariaDB (versi terbaru)
Akash
0

Setelah lebih lanjut menyetel InnoDB pada MariaDB, saya meningkatkan innodb_buffer_pool_sizeukuran database InnoDB saya, sejak itu, InnoDB telah mulai mengambil baris lebih cepat

Saya kira menyetel InnoDB cukup penting sesuai dengan kebutuhan basis data Anda

Akash
sumber