Setelah versi 5.0.3 (yang memungkinkan VARCHAR menjadi 65.535 byte dan berhenti memotong ruang trailing), apakah ada perbedaan besar antara kedua tipe data ini?
Saya membaca daftar perbedaan dan hanya dua catatan adalah:
Untuk indeks pada kolom BLOB dan TEXT, Anda harus menentukan panjang awalan indeks. Untuk CHAR dan VARCHAR, panjang awalan adalah opsional. Lihat Bagian 7.5.1, “Indeks Kolom”.
dan
Kolom BLOB dan TEXT tidak dapat memiliki nilai DEFAULT.
Jadi, karena dua batasan ini pada datatype TEXT, mengapa Anda menggunakannya di varchar (65535)? Apakah ada konsekuensi kinerja satu di atas yang lain?
mysql
database-design
datatypes
Derek Downey
sumber
sumber
Jawaban:
dibagi terkait dengan beberapa info yang menjelaskan masalah dasar (ada perbedaan kinerja), tetapi tidak cukup sederhana untuk mengatakan bahwa seseorang selalu lebih baik daripada yang lain. (Jika tidak, tidak akan ada alasan untuk memiliki keduanya.) Juga, di MyISM, ukuran maksimal 64k untuk VARCHAR bukan per bidang - per rekaman.
Pada dasarnya, ada 4 cara untuk menyimpan string dalam catatan basis data:
MyISM menggunakan sesuatu yang mirip dengan # 3 untuk VARCHAR, dan pendekatan hybrid untuk TEXT di mana ia menyimpan awal string dalam catatan, lalu sisa string di tempat lain. InnoDB serupa untuk VARCHAR, tetapi menyimpan bidang TEKS lengkap di luar catatan.
Dengan 1 & 4, hal-hal dalam catatan selalu sama panjangnya, jadi lebih mudah untuk dilewati jika Anda tidak membutuhkan string, tetapi perlu hal-hal setelahnya. Baik # 2 dan # 3 tidak terlalu buruk untuk string pendek ... # 2 harus terus mencari penanda, sementara # 3 dapat melompat ke depan ... karena string semakin panjang, # 2 semakin buruk untuk penggunaan khusus ini kasus.
Jika Anda benar-benar perlu membaca string, # 4 lebih lambat, karena Anda harus membaca catatan, kemudian membaca string yang mungkin disimpan di tempat lain di disk, tergantung pada bagaimana database itu menanganinya. # 1 selalu sangat mudah, dan sekali lagi Anda mengalami masalah serupa di mana untuk # 2 semakin buruk semakin lama string, sedangkan # 3 sedikit lebih buruk daripada # 2 untuk string yang sangat kecil, tetapi lebih baik karena semakin lama.
Lalu ada persyaratan penyimpanan ... # 1 selalu merupakan panjang yang tetap, jadi mungkin akan menggembung jika sebagian besar string bukan panjang maksimal. # 2 memiliki 1 byte ekstra; # 3 biasanya memiliki 2 byte tambahan jika panjang maks = 255, 4 byte tambahan jika 64k maks. # 4 memiliki panjang pointer, ditambah aturan untuk # 3 biasanya.
Untuk implementasi spesifik dalam MySQL 5.1, dokumen untuk status MyISM :
Sedangkan untuk InnoDB :
...
seperti halnya banyak hal lain ketika berurusan dengan basis data, jika Anda tidak yakin apa yang terbaik untuk kebutuhan Anda, cobalah membandingkannya dengan data & penggunaan yang serupa, dan lihat bagaimana perilakunya.
sumber
LONGTEXT
danLONGBLOB
merupakan contoh kasus. String C-style tidak digunakan oleh MySQL (yang saya tahu). InnoDB memang menggunakan pendekatan 'hybrid', tetapi lebih kompleks, tergantung pada ukuran baris, row_format, dll. Menyimpan string dalam panjang "tetap" hampir tidak pernah disarankan kecuali ketika mereka benar-benar panjang konstan (country_code, zip_code, dll) . InnoDB memiliki 4ROW_FORMATs
; teks hanya membahas 1 atau 2 darinya.Ketika SELECT perlu membuat tabel sementara (seperti untuk mengurutkan hasil), itu akan membuat tabel MEMORY, atau tabel MyISAM. MEMORY lebih efisien. Ada batasan pada MEMORY - satu adalah untuk melarang TEXT dan BLOB. Oleh karena itu, SELECT dapat berjalan lebih lambat dengan TEXT daripada VARCHAR.
sumber