Saya punya tabel pesan di MySQL yang merekam pesan antar pengguna. Terlepas dari id dan tipe pesan tipikal (semua tipe integer) saya perlu menyimpan teks pesan yang sebenarnya sebagai VARCHAR atau TEXT. Saya menetapkan batas front-end 3000 karakter yang berarti pesan tidak akan pernah dimasukkan ke db lebih lama dari ini.
Apakah ada alasan untuk menggunakan VARCHAR (3000) atau TEXT? Ada sesuatu tentang hanya menulis VARCHAR (3000) yang terasa agak kontra-intuitif. Saya telah melalui posting serupa lainnya di Stack Overflow tetapi akan lebih baik untuk mendapatkan tampilan spesifik untuk jenis penyimpanan pesan umum ini.
Jawaban:
TEXT
danBLOB
mungkin dengan disimpan dari meja dengan tabel hanya memiliki pointer ke lokasi penyimpanan yang sebenarnya. Di mana itu disimpan tergantung pada banyak hal seperti ukuran data, ukuran kolom, row_format, dan versi MySQL.VARCHAR
disimpan sejajar dengan tabel.VARCHAR
lebih cepat ketika ukurannya masuk akal, pengorbanannya akan lebih cepat tergantung pada data dan perangkat keras Anda, Anda ingin membandingkan skenario dunia nyata dengan data Anda.sumber
varchar
danblob
/text
pada InnoDB untuk item teks kecil? Jadi akan kemudian bijaksana untuk hanya membuat setiapvarchar
satutext
jenis dan membiarkan DB mengelola inline vs overflow?Bisakah Anda memprediksi berapa lama input pengguna?
sumber
Hanya untuk mengklarifikasi praktik terbaik:
Pesan berformat teks hampir selalu disimpan sebagai TEXT (akhirnya panjangnya sewenang-wenang)
Atribut string harus disimpan sebagai VARCHAR (nama pengguna tujuan, subjek, dll ...).
Saya mengerti bahwa Anda memiliki batas ujung depan, yang sangat bagus sampai tidak. * nyengir * Caranya adalah menganggap DB terpisah dari aplikasi yang terhubung dengannya. Hanya karena satu aplikasi membatasi data, tidak berarti bahwa data secara intrinsik terbatas.
Ada apa dengan pesan itu sendiri yang memaksa mereka untuk tidak pernah lebih dari 3000 karakter? Jika itu hanya kendala aplikasi yang sewenang-wenang (misalnya, untuk kotak teks atau sesuatu), gunakan
TEXT
bidang di lapisan data.sumber
Penafian: Saya bukan ahli MySQL ... tapi ini adalah pemahaman saya tentang masalah ini.
Saya pikir TEXT disimpan di luar baris mysql, sementara saya pikir VARCHAR disimpan sebagai bagian dari baris. Ada panjang baris maksimum untuk baris mysql .. sehingga Anda dapat membatasi berapa banyak data lain yang dapat Anda simpan dalam satu baris dengan menggunakan VARCHAR.
Juga karena VARCHAR membentuk bagian dari baris, saya menduga bahwa permintaan melihat bidang itu akan sedikit lebih cepat daripada yang menggunakan potongan TEXT.
sumber
varchar
kolom 3000 karakter dapat memakan waktu hingga 9000 byte.TEXT
inline di tabel.Jawaban singkat: Tidak ada perbedaan praktis, kinerja, atau penyimpanan.
Jawaban panjang:
Pada dasarnya tidak ada perbedaan (dalam MySQL) antara
VARCHAR(3000)
(atau batas besar lainnya) danTEXT
. Yang pertama akan dipotong pada 3000 karakter ; yang terakhir akan dipotong pada 65535 byte . (Saya membuat perbedaan antara byte dan karakter karena karakter dapat mengambil banyak byte.)Untuk batas yang lebih kecil
VARCHAR
, ada beberapa kelebihan di atasTEXT
.CHARACTER SET
.INDEXes
terbatas pada seberapa besar kolom dapat diindeks. (767 atau 3072 byte ; ini tergantung versi dan pengaturan)SELECTs
ditangani dengan dua cara berbeda - MEMORY (lebih cepat) atau MyISAM (lebih lambat). Ketika kolom 'besar' terlibat, teknik yang lebih lambat akan dipilih secara otomatis. (Perubahan signifikan datang dalam versi 8.0; jadi butir ini dapat berubah.)TEXT
tipe data (sebagai lawan dariVARCHAR
) melompat langsung ke MyISAM. Artinya,TINYTEXT
secara otomatis lebih buruk untuk tabel temp yang dihasilkan daripada yang setaraVARCHAR
. (Tapi ini membawa diskusi ke arah ketiga!)VARBINARY
sepertiVARCHAR
;BLOB
sepertiTEXT
.Bantahan terhadap jawaban lain
Pertanyaan asli menanyakan satu hal (tipe data mana yang digunakan); jawaban yang diterima menjawab hal lain (penyimpanan tidak direkam). Jawaban itu sudah ketinggalan zaman.
Ketika utas ini dimulai dan dijawab, hanya ada dua "format baris" di InnoDB. Segera setelah itu, dua format lagi (
DYNAMIC
danCOMPRESSED
) diperkenalkan.Lokasi penyimpanan untuk
TEXT
danVARCHAR()
didasarkan pada ukuran , bukan pada nama tipe data . Untuk diskusi terbaru penyimpanan on / off-record kolom teks / gumpalan besar, lihat ini .sumber
Jawaban sebelumnya tidak cukup menekankan pada masalah utama: bahkan dalam pertanyaan yang sangat sederhana seperti
tabel sementara dapat diminta, dan jika suatu
VARCHAR
bidang dilibatkan, itu dikonversi keCHAR
bidang dalam tabel sementara. Jadi, jika Anda memiliki di meja Anda mengatakan 500 000 baris denganVARCHAR(65000)
bidang, kolom ini saja akan menggunakan 6,5 * 5 * 10 ^ 9 byte. Tabel temp semacam itu tidak dapat ditangani dalam memori dan ditulis ke disk. Dampaknya bisa menjadi bencana.Sumber (dengan metrik): https://nicj.net/mysql-text-vs-varchar-performance/ (Ini merujuk pada penanganan
TEXT
vsVARCHAR
pada "standar" (?) Mesin penyimpanan MyISAM. Mungkin berbeda pada yang lain, mis., InnoDB.)sumber
Ada perbedaan BESAR antara VARCHAR dan TEXT. Sementara bidang VARCHAR dapat diindeks, bidang TEXT tidak bisa. Bidang tipe VARCHAR disimpan inline saat TEXT disimpan offline, hanya pointer ke data TEXT yang sebenarnya disimpan dalam catatan.
Jika Anda harus mengindeks bidang Anda untuk pencarian yang lebih cepat, perbarui atau hapus daripada pergi untuk VARCHAR, tidak peduli seberapa besar. VARCHAR (10000000) tidak akan pernah sama dengan bidang TEXT karena kedua tipe data ini berbeda.
daripada pergi untuk TEKS.
sumber
Varchar adalah untuk data kecil seperti alamat email, sedangkan Teks untuk data yang jauh lebih besar seperti artikel berita, Blob untuk data biner seperti gambar.
Kinerja Varchar lebih kuat karena berjalan sepenuhnya dari memori, tetapi ini tidak akan menjadi masalah jika data terlalu besar seperti
varchar(4000)
misalnya.Teks, di sisi lain, tidak menempel ke memori dan dipengaruhi oleh kinerja disk, tetapi Anda dapat menghindarinya dengan memisahkan data teks dalam tabel terpisah dan menerapkan kueri gabung kiri untuk mengambil data teks.
Blob jauh lebih lambat jadi gunakan hanya jika Anda tidak memiliki banyak data seperti 10.000 gambar yang akan menelan biaya 10.000 catatan.
Ikuti tips ini untuk kecepatan dan kinerja maksimum:
Gunakan varchar untuk nama, judul, email
Gunakan Teks untuk data besar
Pisahkan teks dalam tabel yang berbeda
Gunakan kueri Gabung Kiri pada ID seperti nomor telepon
Jika Anda akan menggunakan Blob, terapkan tip yang sama seperti pada Teks
Ini akan membuat kueri biaya milidetik pada tabel dengan data> 10 M dan ukuran hingga 10GB dijamin.
sumber