InnoDB menyimpan tabel "lebar" dengan cara yang berbeda. Alih-alih menyatukan semua kolom dalam satu string (ditambah overhead, seperti panjang, dll), ia melakukan hal berikut:
- Jika total semua kolom untuk baris tertentu melebihi sekitar 8 KB, sebagian data akan dipindahkan ke area penyimpanan lain ("tidak direkam").
- Kolom mana yang dipindahkan secara tidak direkam bergantung pada ukuran kolom, dll.
- Detailnya bergantung pada
ROW_FORMAT
dipilih. - "Off-record" adalah blok (atau blok) 16 KB lainnya.
- Nanti, saat melakukan
SELECT *
(atau setidaknya mengambil kolom yang tidak direkam), itu harus melakukan pengambilan disk lain.
Apa yang harus dilakukan?
- Pikirkan kembali untuk memiliki begitu banyak kolom.
- Pertimbangkan "partisi vertikal", di mana Anda memiliki tabel lain yang berisi
TEXT
yang dipilih kolom. Sarankan untuk memilih grup kolom berdasarkan pola akses di aplikasi Anda. - Untuk kolom yang biasanya cukup panjang, pertimbangkan untuk mengompresnya di klien dan menyimpannya ke dalam
BLOB
bukannyaTEXT
. Sebagian besar "teks" menyusut 3:1. Gumpalan dikirim tidak direkam sama seperti Teks, namun, gumpalan terkompresi ini akan lebih kecil, sehingga kecil kemungkinannya untuk tumpah. - Lakukan lebih banyak pemrosesan dalam SQL -- untuk menghindari pengembalian semua baris, atau untuk menghindari pengembalian teks lengkap, dll. Saat menyekop banyak teks secara membabi buta ke klien, jaringan dan klien menjadi faktor penting dalam waktu yang telah berlalu, bukan hanya
SELECT
, sendiri.