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

Kinerja MySQL BIGINT(20) vs Varchar(31)

Ini benar-benar harus diukur, kita dapat membuat beberapa "tebakan" berdasarkan apa yang kita ketahui, dan apa yang kita asumsikan, tetapi itu hanya tebakan.

Anda tidak menyebutkan apakah tabel ini adalah InnoDB, atau MyISAM dengan baris dinamis, atau MyISAM dengan baris panjang tetap. Itu akan membuat perbedaan.

Tetapi untuk nilai seperti yang Anda posting, '961637593864109_412954765521130' (31 karakter), dengan asumsi Anda menggunakan satu byte characterset (misalnya latin1), atau characterset yang mengkodekan karakter tertentu menjadi satu byte (misalnya utf8)...

Untuk format dinamis InnoDB dan MyISAM, itu adalah 31+1-8=24 byte tambahan untuk baris itu. (BIGINT muat dalam 8 byte, nilai VARCHAR(31) dari 31 karakter akan menggunakan 32 byte.)

Untuk tabel MyISAM dengan baris panjang tetap, itu akan menjadi perbedaan 23 byte per baris. (Spasi disediakan untuk 31 karakter, dan panjangnya tidak harus disimpan.)

Nilai kunci utama itu juga akan diulang di setiap indeks, jadi ada juga peningkatan ruang di setiap indeks.

Dengan asumsi bahwa baris tabel Anda adalah 120 byte menggunakan BIGINT, dan barisnya adalah 144 byte dengan VARCHAR, itu adalah 20% meningkat. Semakin besar baris Anda, semakin kecil persentase peningkatannya, dan sebaliknya.

Untuk 1.000.000 baris (saya sangat ingin mengatakan "satu baris meelyun" dengan cara yang sama seperti Dr. Evil meletakkan jari kelingkingnya ke sudut mulut ini dan mengatakan "satu juta dolar") bahwa tambahan 24 byte per baris total sekitar 24MB.

Tapi itu tidak mudah. Dalam hal ruang InnoDB, ini masalah bagaimana baris "pas" ke dalam blok. Semakin besar ukuran baris rata-rata, semakin besar jumlah ruang kosong dalam satu blok.

Jika Anda tidak melakukan apa pun dengan baris tersebut kecuali menyimpannya di disk, maka itu sebenarnya hanya menambah ruang disk, dan waktu serta ruang ekstra untuk pencadangan.

Jika jumlah baris "144 byte" yang sama cocok dalam satu blok dengan baris "120 byte", maka Anda tidak akan melihat perbedaan ruang. Tetapi jika lebih sedikit baris yang muat dalam satu blok, itu lebih banyak blok, lebih banyak ruang di kumpulan buffer InnoDB, lebih banyak i/o, dll.

Untuk kueri satu baris, baik menurut nilai kunci utama, atau dengan beberapa pencarian indeks unik lainnya, perbedaannya akan diabaikan.

Jika Anda berurusan dengan kumpulan hasil yang lebih besar, maka itu adalah memori ekstra untuk menyiapkan kumpulan hasil, dan byte tambahan untuk ditransfer ke klien, dll.

Jika kunci VARCHAR dirancang sedemikian rupa sehingga "grup" baris yang diakses bersama-sama memiliki bagian utama yang sama dari nilai kunci, maka dengan InnoDB, sebenarnya mungkin ada beberapa peningkatan kinerja. Itu karena kunci utama adalah kunci klaster... peluang baris yang jauh lebih baik yang diperlukan untuk memenuhi kueri berada di blok yang sama, daripada tersebar di beberapa blok.

Sebaliknya jika ada penyisipan dan penghapusan, akan ada lebih banyak ruang kosong di beberapa blok. (Dengan penghapusan, ruang untuk baris yang dihapus tetap berada di blok; untuk menggunakannya kembali, Anda harus memasukkan baris yang memiliki nilai kunci yang sama (atau setidaknya nilai kunci cukup dekat sehingga mendarat di blok yang sama .) Dan dengan sisipan acak, kita akan mendapatkan pemisahan blok.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menggunakan SSH Tunneling sebagai Alternatif VPN

  2. 12 Praktik Terbaik Keamanan MySQL/MariaDB untuk Linux

  3. Pemulihan Penuh Cluster MySQL atau MariaDB Galera dari Cadangan

  4. Permintaan MySQL untuk mendapatkan produk WooCommerce berdasarkan nama kategori

  5. SQL menggabungkan data dari beberapa tabel dengan MYSQL