Bagaimana MyISAM bisa "lebih cepat" dari InnoDB jika
- MyISAM perlu melakukan pembacaan disk untuk data?
- InnoDB menggunakan kumpulan buffer untuk indeks dan data, dan MyISAM hanya untuk indeks?
mysql
innodb
myisam
storage-engine
jcho360
sumber
sumber
Jawaban:
Satu-satunya cara MyISAM bisa lebih cepat dari itu InnoDB akan berada di bawah keadaan unik ini
MyISAM
Saat dibaca, 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 dibaca? Dengan ini:
Saya menulis tentang ini di posting saya sebelumnya
InnoDB
OK, bagaimana dengan InnoDB? Apakah InnoDB melakukan disk I / O untuk kueri? 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 dicatat? 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
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.
KESIMPULAN
Rencanakan tipe data, kueri, dan mesin penyimpanan Anda dengan saksama. Setelah data tumbuh, mungkin akan sangat sulit untuk memindahkan data. Tanyakan saja ke Facebook ...
sumber
Dalam dunia yang sederhana, MyISAM lebih cepat untuk dibaca, InnoDB lebih cepat untuk menulis.
Setelah Anda mulai memperkenalkan campuran baca / tulis, InnoDB akan lebih cepat untuk dibaca juga, berkat mekanisme penguncian Row.
Saya menulis perbandingan mesin penyimpanan MySQL beberapa tahun yang lalu, yang masih berlaku sampai hari ini, menguraikan perbedaan unik antara MyISAM dan InnoDB.
Dalam pengalaman saya, Anda harus menggunakan InnoDB untuk semuanya kecuali untuk cache-tabel read-heavy, di mana kehilangan data karena korupsi tidak begitu penting.
sumber
Untuk menambah tanggapan di sini meliputi perbedaan mekanis antara dua mesin, saya menyajikan studi perbandingan kecepatan empiris.
Dalam hal kecepatan murni, itu tidak selalu terjadi bahwa MyISAM lebih cepat dari InnoDB tetapi dalam pengalaman saya cenderung lebih cepat untuk lingkungan kerja MURNI BACA dengan faktor sekitar 2,0-2,5 kali. Jelas ini tidak sesuai untuk semua lingkungan - seperti yang ditulis orang lain, MyISAM tidak memiliki hal-hal seperti transaksi dan kunci asing.
Saya telah melakukan sedikit pembandingan di bawah ini - Saya telah menggunakan python untuk perulangan dan perpustakaan timeit untuk perbandingan waktu. Untuk menarik saya juga menyertakan mesin memori, ini memberikan kinerja terbaik di seluruh papan meskipun hanya cocok untuk tabel yang lebih kecil (Anda terus menerus menemukan
The table 'tbl' is full
ketika Anda melebihi batas memori MySQL). Empat jenis pilih yang saya lihat adalah:Pertama, saya membuat tiga tabel menggunakan SQL berikut
dengan 'MyISAM' menggantikan 'InnoDB' dan 'memori' di tabel kedua dan ketiga.
1) Vanilla memilih
Pertanyaan:
SELECT * FROM tbl WHERE index_col = xx
Hasil: menggambar
Kecepatannya semua sama, dan seperti yang diharapkan linear dalam jumlah kolom yang akan dipilih. InnoDB tampaknya sedikit lebih cepat daripada MyISAM tetapi ini benar-benar marjinal.
Kode:
2) Hitungan
Pertanyaan:
SELECT count(*) FROM tbl
Hasil: MyISAM menang
Yang ini menunjukkan perbedaan besar antara MyISAM dan InnoDB - MyISAM (dan memori) melacak jumlah catatan dalam tabel, sehingga transaksi ini cepat dan O (1). Jumlah waktu yang diperlukan untuk InnoDB untuk menghitung meningkat secara super-linear dengan ukuran tabel dalam kisaran yang saya selidiki. Saya menduga banyak percepatan dari pertanyaan MyISAM yang diamati dalam praktek adalah karena efek yang sama.
Kode:
3) Memilih kondisional
Pertanyaan:
SELECT * FROM tbl WHERE value1<0.5 AND value2<0.5 AND value3<0.5 AND value4<0.5
Hasil: MyISAM menang
Di sini, MyISAM dan memori melakukan kira-kira sama, dan mengalahkan InnoDB sekitar 50% untuk tabel yang lebih besar. Ini adalah jenis permintaan yang manfaat MyISAM tampaknya dimaksimalkan.
Kode:
4) Sub-pilih
Hasil: InnoDB menang
Untuk kueri ini, saya membuat satu set tabel tambahan untuk sub-pilih. Masing-masing hanya dua kolom BIGINTs, satu dengan indeks kunci utama dan satu tanpa indeks apa pun. Karena ukuran meja yang besar, saya tidak menguji mesin memori. Perintah pembuatan tabel SQL adalah
di mana sekali lagi, 'MyISAM' diganti untuk 'InnoDB' di tabel kedua.
Dalam kueri ini, saya meninggalkan ukuran tabel pemilihan pada 1000000 dan sebagai gantinya memvariasikan ukuran kolom yang dipilih.
Di sini InnoDB menang dengan mudah. Setelah kita sampai ke tabel ukuran yang masuk akal, kedua mesin berskala linier dengan ukuran sub-pilih. Indeks mempercepat perintah MyISAM tetapi menarik tidak banyak berpengaruh pada kecepatan InnoDB. subSelect.png
Kode:
Saya pikir pesan yang bisa dibawa pulang dari semua ini adalah bahwa jika Anda benar - benar peduli tentang kecepatan, Anda perlu membandingkan permintaan yang Anda lakukan daripada membuat asumsi tentang mesin mana yang akan lebih cocok.
sumber
SELECT * FROM tbl WHERE index_col = xx
- Berikut adalah dua faktor yang cenderung menyebabkan lebih banyak variasi dalam grafik: Kunci primer vs kunci sekunder; indeks di-cache vs tidak.SELECT COUNT(*)
adalah pemenang yang jelas untuk MyISAM sampai Anda menambahkanWHERE
klausa.Mana yang lebih cepat? Mungkin lebih cepat. YMMV.
Yang mana yang harus Anda gunakan? InnoDB - crash-safe, dll, dll.
sumber