Anda harus mencoba untuk melihat kolom varchar sama seperti Anda melihat kolom karakter di kebanyakan skenario dan mengatur panjangnya secara konservatif. Anda tidak harus selalu memikirkan pengubah var sebagai sesuatu yang memengaruhi pengambilan keputusan Anda secara maksimal. Ini benar-benar harus dilihat sebagai petunjuk kinerja alih-alih bahwa string yang disediakan akan memiliki panjang yang bervariasi.
Ini bukan arahan yang harus diikuti secara ketat oleh internal database, itu dapat diabaikan sepenuhnya. Berhati-hatilah dengan hal ini karena terkadang implementasi dapat bocor (panjang dan bantalan tetap misalnya) meskipun seharusnya tidak di dunia yang ideal.
Jika Anda memiliki varchar (255) maka Anda tidak memiliki jaminan bahwa performa bijaksana akan selalu berperilaku berbeda dengan char (255) dalam semua keadaan.
Tampaknya mudah untuk mengaturnya pada sesuatu seperti 255, 65535, dll, sejalan dengan saran yang diberikan dalam manual tentang persyaratan penyimpanan. Ini memberi kesan bahwa nilai apa pun antara 0 (ya, itu adalah hal) dan 255 akan memiliki dampak yang sama. Namun itu bukanlah sesuatu yang bisa dijamin sepenuhnya.
Persyaratan penyimpanan cenderung benar atau indikator yang baik untuk mesin penyimpanan persisten yang layak dan matang dalam hal penyimpanan baris. Ini bukan indikator yang kuat untuk hal-hal seperti indeks.
Ini terkadang pertanyaan yang sulit, tepatnya berapa panjang seutas benang sehingga memasangnya ke batas tertinggi yang Anda tahu seharusnya ada di dalam tetapi itu tidak berdampak. Sayangnya ini sering kali merupakan sesuatu yang diserahkan kepada pengguna untuk diselesaikan dan ini benar-benar sewenang-wenang. Anda tidak bisa benar-benar mengatakan tidak pernah terlalu besar string karena mungkin ada kasus di mana Anda tidak yakin.
Anda harus memastikan bahwa kueri MySQL menampilkan kesalahan saat string terlalu panjang daripada terpotong sehingga setidaknya Anda tahu jika terlalu pendek dari emisi kesalahan. Mengubah ukuran kolom untuk memperbesar atau memperkecilnya bisa menjadi operasi DDL yang mahal, hal ini harus diingat.
Set karakter juga harus dipertimbangkan di mana durasi dan kinerja berperan. Panjangnya mengacu pada ini daripada byte. Jika menggunakan utf8 misalnya, (bukan MB4) maka varchar (255) benar-benar varbinary (3 * 255). Sulit untuk mengetahui bagaimana hal-hal seperti ini akan benar-benar berjalan tanpa menjalankan tes dan melihat lebih dalam ke kode sumber / dokumentasi. Karena itu, ada ruang lingkup untuk panjang yang berlebihan untuk menimbulkan dampak yang meningkat secara tidak terduga. ini tidak hanya berlaku untuk kinerja. Jika suatu hari Anda perlu mengubah kumpulan karakter dari kolom varchar ke yang lebih besar maka Anda mungkin akan mencapai beberapa batas tanpa jalan lain jika Anda mengizinkan string yang sangat panjang untuk hadir yang bisa dihindari. Ini biasanya masalah yang cukup khusus tetapi muncul,
Jika ternyata MAX (PANJANG (kolom)) selalu <64 (seperti jika diputuskan akan ada batasan input yang tidak cocok dengan definisi kolom) tetapi Anda memiliki varchar (255) maka ada kemungkinan besar Anda akan menggunakan ruang empat kali lebih banyak dari yang dibutuhkan dalam beberapa skenario.
Ini mungkin termasuk:
- Mesin yang berbeda, beberapa mungkin mengabaikannya sama sekali.
- Ukuran penyangga, misalnya pembaruan atau penyisipan mungkin harus mengalokasikan 255 penuh (meskipun saya belum memeriksa kode sumber untuk membuktikan ini, itu hanya hipotetis).
- Indeks, ini akan segera terlihat jika Anda mencoba membuat kunci komposit dari banyak kolom varchar (255).
- Tabel perantara dan mungkin kumpulan hasil. Mengingat cara kerja transaksi, mungkin tidak selalu ada sesuatu yang menggunakan panjang maksimal string aktual dalam kolom sebagai lawan dari batas yang ditentukan.
- Pengoptimalan prediksi internal mungkin memerlukan panjang maksimal sebagai input.
- Perubahan versi implementasi database.
Sebagai aturan praktis, sebenarnya varchar tidak perlu lebih panjang dari yang seharusnya, masalah kinerja atau tidak, jadi saya sarankan untuk tetap menggunakannya saat Anda bisa. Mengambil lebih banyak upaya untuk mengambil sampel ukuran data Anda, menegakkan batas sebenarnya, atau mencari tahu batas sebenarnya melalui pertanyaan / penelitian adalah pendekatan yang ideal.
Ketika Anda tidak bisa, jika Anda ingin melakukan sesuatu seperti varchar (255) untuk kasus ketika ragu maka saya sarankan melakukan sains. Ini mungkin terdiri dari menduplikasi tabel, mengurangi ukuran kolom var char kemudian menyalin data ke dalamnya dari aslinya dan melihat ukuran data indeks / baris (indeks kolom juga, coba juga sebagai kunci utama yang mana mungkin berperilaku berbeda di InnoDB karena baris diurutkan berdasarkan kunci utama). Setidaknya dengan cara ini Anda akan tahu apakah Anda memiliki dampak pada IO yang cenderung menjadi salah satu hambatan paling sensitif. Menguji penggunaan memori lebih sulit, sulit untuk menguji itu secara menyeluruh. Saya akan merekomendasikan pengujian potensi kasus terburuk (kueri dengan banyak perantara dalam hasil memori, periksa dengan menjelaskan untuk tabel temp besar, dll).
Jika Anda tahu tidak akan ada banyak baris dalam tabel, Anda tidak akan menggunakan kolom untuk gabungan, indeks (terutama komposit, unik), dll. Maka kemungkinan besar Anda tidak akan mengalami banyak masalah.
VARCHAR(255) utf8mb4
kolom terindeks dengan ~ 150 ribu baris berukuran 11,5 MB. Tabel denganVARCHAR(48) utf8mb4
kolom terindeks dengan data yang sama (panjang maksimal 46 karakter) menggunakan 4,5MB. Bukan perbedaan besar dalam kueri, ini diindeks. Tapi itu bertambah dengan query I / O dan hal-hal seperti backup database.