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?
Jawaban:
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:
Saya menulis tentang ini di posting saya sebelumnya
Sep 20, 2011
: /dba/5974/best-of-myisam-and-innodb/6008#6008 (Silakan Baca Yang Ini Pertama)May 10, 2011
: /dba/2640/what-is-the-performance-impact-of-using-char-vs-varchar-on-a-fixed-size-field/2643#2643 (TRADEOFF # 2)Aug 12, 2011
: /dba/4576/which-dbms-is-good-for-super-fast-reads-and-a-simple-data-structure/4589#4589 (Paragraf 3)Jan 03, 2012
: /dba/10069/optimized-my-cnf-for-high-end-and-busy-server/10080#10080 (Di bawah judul Replikasi )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
I
inACID
, 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?
DELETEs
danUPDATEs
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?
sumber
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.
sumber
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.
sumber
Lihat situs ini, ia memiliki informasi yang sangat berguna:
http://www.mysqlperformanceblog.com/2007/11/01/innodb-performance-optimization-basics/
http://www.mysqlperformanceblog.com/2007/11/03/choosing-innodb_buffer_pool_size/
Anda juga dapat mengatur sistem file Anda. Saya memiliki hasil kinerja yang baik pada XFS dengan nilai sunit dan swidth yang optimal (tentu saja jika Anda menggunakan RAID)
sumber
Setelah lebih lanjut menyetel InnoDB pada MariaDB, saya meningkatkan
innodb_buffer_pool_size
ukuran database InnoDB saya, sejak itu, InnoDB telah mulai mengambil baris lebih cepatSaya kira menyetel InnoDB cukup penting sesuai dengan kebutuhan basis data Anda
sumber