it-swarm.asia

Apa perbedaan antara tipe data MySQL VARCHAR dan TEXT?

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 sedang 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?

19
Derek Downey

dibagi ditautkan ke beberapa info yang menjelaskan masalah dasar (ada perbedaan kinerja), tetapi tidak cukup sederhana untuk mengatakan bahwa yang satu 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 catatan.

Pada dasarnya, ada 4 cara untuk menyimpan string dalam catatan basis data:

  1. panjang tetap
  2. String C-style (ditandai dengan NULL atau karakter serupa di akhir string)
  3. String gaya pascal (beberapa byte untuk menunjukkan panjang, kemudian string)
  4. Pointer (simpan string di tempat lain)

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, the docs for MyISM state :

  • Dukungan untuk tipe VARCHAR sejati; kolom VARCHAR dimulai dengan panjang yang disimpan dalam satu atau dua byte.
  • Tabel dengan kolom VARCHAR mungkin memiliki panjang baris tetap atau dinamis.
  • Jumlah dari panjang kolom VARCHAR dan CHAR dalam sebuah tabel bisa mencapai 64KB.

Sementara ntuk InnoDB :

  • Bagian panjang variabel dari header catatan berisi vektor bit untuk menunjukkan kolom NULL. Jika jumlah kolom dalam indeks yang bisa NULL adalah N, vektor bit menempati CEILING (N/8) byte. (Misalnya, jika ada 9 hingga 15 kolom yang dapat berupa NULL, vektor bit menggunakan dua byte.) Kolom yang NULL tidak menempati ruang selain bit dalam vektor ini. Bagian panjang variabel dari header juga berisi panjang kolom panjang variabel. Setiap panjang membutuhkan satu atau dua byte, tergantung pada panjang maksimum kolom. Jika semua kolom dalam indeks BUKAN NULL dan memiliki panjang tetap, header catatan tidak memiliki bagian panjang variabel.
  • Untuk setiap bidang panjang variabel non-NULL, header catatan berisi panjang kolom dalam satu atau dua byte. Dua byte hanya akan diperlukan jika bagian kolom disimpan secara eksternal di halaman meluap atau panjang maksimum melebihi 255 byte dan panjang sebenarnya melebihi 127 byte. Untuk kolom yang disimpan secara eksternal, panjang dua byte menunjukkan panjang bagian yang disimpan secara internal ditambah penunjuk 20-byte ke bagian yang disimpan secara eksternal. Bagian internal 768 byte, jadi panjangnya 768 + 20. Pointer 20 byte menyimpan panjang kolom yang sebenarnya.

...

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.

13
Joe

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 may berjalan lebih lambat dengan TEXT daripada VARCHAR.

2
Rick James