Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Apakah ada perbedaan antara varchar(10) dan varchar(1000) ketika kami menyimpan string yang panjangnya kurang dari 10?

Ini sepenuhnya tergantung pada mesin DBMS yang digunakan. SQL sendiri tidak mengamanatkan bagaimana hal-hal disimpan secara fisik, hanya bagaimana mereka dilihat secara logis.

Misalnya, DBMS Anda mungkin mengalokasikan ruang di baris untuk ukuran maksimum, ditambah beberapa byte tambahan untuk menyimpan panjangnya. Dalam hal ini, akan ada perbedaan besar antara varchar(10) dan varchar(1000) karena Anda akan membuang cukup banyak ruang per baris.

Atau, mungkin menggunakan kumpulan buffer untuk varchar data dan simpan hanya panjang dan kumpulan buffer "alamat awal" di baris. Dalam hal ini, setiap baris akan menyimpan informasi berukuran identik untuk varchar terlepas dari ukurannya, tetapi akan ada langkah tambahan untuk mengekstrak data aktual di kolom tersebut (mengikuti tautan ke kumpulan buffer).

Alasan Anda menggunakan varchar itulah mengapa dinamai varchar . Ini memungkinkan Anda untuk menyimpan elemen data berukuran variabel. Biasanya, char(10) memberi Anda sepuluh karakter, apa pun yang terjadi, mengisinya dengan spasi jika Anda memasukkan sesuatu yang lebih pendek. Anda dapat memangkas spasi tambahan saat mengekstraknya, tetapi itu tidak akan berfungsi dengan baik jika data yang ingin Anda simpan sebenarnya adalah "hello " , dengan ruang tambahan yang ingin Anda pertahankan.

Mesin DBMS yang layak dapat memutuskan untuk melakukan pertukaran tergantung pada ukuran maksimum varchar kolom. Untuk yang pendek, itu bisa menyimpannya sebaris di baris dan menggunakan byte ekstra untuk ukurannya.

varchar lebih panjang kolom dapat "dialihdayakan" ke kumpulan buffer terpisah untuk memastikan pembacaan baris tetap efisien (setidaknya sampai Anda membutuhkan varchar large yang besar kolom, bagaimanapun).

Yang perlu Anda lakukan adalah mengajukan kembali pertanyaan untuk DBMS spesifik Anda untuk mendapatkan jawaban yang lebih tepat sasaran.

Atau, sejujurnya, rekayasa database Anda untuk hanya menyimpan ukuran maksimum. Jika Anda tahu itu 10, maka varchar(1000) adalah pemborosan. Jika, di masa mendatang, Anda perlu memperbesar kolom, itu adalah waktu untuk melakukannya, daripada sekarang (lihat YAGNI ).

Untuk MySQL, Anda dapat melihat Chapter 14 Storage Engines dari dokumentasi online.

Ini mencakup berbagai mesin penyimpanan (seperti InnoDB dan MyISAM) yang digunakan MySQL dan, dengan melihat lebih dalam, Anda dapat melihat bagaimana informasi tersebut disimpan secara fisik.

Misalnya, di MyISAM, keberadaan data panjang variabel dalam tabel (varchar disertakan) biasanya berarti tabel dinamis . Ini mengikuti skema yang kira-kira analog dengan konsep buffer pool yang saya sebutkan di atas, dengan keuntungan lebih sedikit ruang yang terbuang untuk kolom berukuran variabel, dan kerugiannya adalah baris dapat menjadi terfragmentasi.

Format penyimpanan lainnya (diskon format terkompresi karena hanya benar-benar digunakan untuk tabel hanya-baca) adalah statis , tempat data disimpan dalam satu baris fisik.

Informasi tentang struktur fisik InnoDB dapat ditemukan di sini . Bergantung pada apakah Anda menggunakan format file Antelope atau Barracuda, Anda berakhir dengan situasi "semua informasi adalah baris fisik" atau "buffer pool", mirip dengan perbedaan MyISAM antara dinamis dan statis.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Buat tabel SQL sebaris dengan cepat (untuk gabungan kiri yang tidak termasuk)

  2. Spring Boot + Spring Data JPA query dari tipe java.util.Date hanya menggunakan bulan

  3. MySQL menghitung semua di luar batas

  4. BATAS kata kunci di MySQL dengan pernyataan yang disiapkan

  5. Izinkan semua koneksi jarak jauh, MySQL