it-swarm.asia

Kapan menggunakan TINYINT melalui INT?

Secara umum, saya selalu menggunakan Ints. Saya tahu bahwa secara teori ini bukan praktik terbaik, karena Anda harus menggunakan tipe data terkecil yang akan dijamin untuk menyimpan data.

Sebagai contoh, lebih baik menggunakan tinyint ketika Anda tahu bahwa satu-satunya data yang akan Anda simpan adalah 1, 0 atau nol (dengan kemungkinan sangat kecil untuk memperluasnya menjadi 2 atau 3 nanti).

Namun, satu-satunya alasan saya tahu untuk melakukan ini adalah untuk tujuan penyimpanan - menggunakan 1 byte berturut-turut, bukan 4 byte.

Apa dampak menggunakan tinyint (atau smallint atau bahkan bigint) hanya pada int, selain menghemat ruang pada hard drive Anda?

92
Richard

Ruang disk murah ... bukan itu intinya!

Berhentilah berpikir dalam hal ruang penyimpanan, alih-alih pikirkan tentang buffer pool dan bandwidth penyimpanan . Pada akhirnya, cache CPU dan bandwidth bus memori . Artikel yang ditautkan adalah bagian dari seri yang menyoroti masalah dengan pemilihan kunci yang kurang baik (INT vs GUID vs GUID Berurutan) tetapi menyoroti perbedaan yang bisa dibuat oleh byte.

Pesan utama adalah masalah desain. Perbedaannya tidak akan muncul dalam database individual pada server yang ditentukan secara tepat sampai Anda menekan wilayah VLDB tetapi jika Anda dapat menyimpan beberapa byte, mengapa tidak melakukannya.

Saya teringat lingkungan yang dijelaskan dalam pertanyaan sebelumnya . 400+ basis data, mulai dari ukuran 50mb-50GB, per instance SQL. Menggosok beberapa byte per rekaman, per tabel, per basis data di lingkungan itu dapat membuat perbedaan yang signifikan.

92

Selain jawaban lainnya ...

Baris dan entri indeks disimpan dalam halaman 8k. Jadi sejuta baris pada 3 byte per baris bukan 3 MB pada disk: itu mempengaruhi jumlah baris per halaman ("kepadatan halaman").

Hal yang sama berlaku untuk nvarchar ke varchar, smalldatetime ke datetime, int ke tinyint dll

Edit, Juni 2013

http://sqlblog.com/blogs/joe_chang/archive/2013/06/16/load-test-manifesto.aspx

Artikel ini menyatakan

Kriteria penting adalah kardinalitas dan rasio halaman ke baris.

Jadi, pilihan tipe data penting

29
gbn

Bukan hanya penyimpanan meja yang menjadi pertimbangan. Jika Anda menggunakan indeks di mana kolom int adalah bagian dari kunci majemuk, Anda tentu ingin halaman indeks selengkap mungkin, ini menjadi hasil entri indeks sekecil mungkin.

Saya pasti berharap menemukan bahwa memeriksa entri indeks di halaman BTREE akan sedikit lebih cepat dengan tipe data yang lebih kecil. Namun, setiap VARCHAR yang terlibat dalam entri indeks akan mengimbangi (membatalkan) keuntungan kinerja dari penggunaan TINYINT atas INT.

Sekalipun demikian, jika entri indeks memiliki entri majemuk dan semuanya bilangan bulat, semakin kecil bilangan bulatnya, semakin baik dan semakin cepat.

14
RolandoMySQLDBA

Semua hal menjadi semakin rumit saat database semakin besar:

  • jendela pemeliharaan perlu diperbesar atau dijadwal ulang
  • backup (backup penuh di akhir hari menjadi pemakan waktu yang absurd, jadi Anda memerlukan diferensial atau bahkan membuat backup log dan melakukan full seminggu sekali, mungkin sebulan sekali)
  • performance maintanances menjadi pemakan waktu (membuat indeks pada tabel multi-juta-baris tidak membutuhkan waktu yang sepele untuk dieksekusi) dan perlu dijadwal ulang dan menjadi lebih buruk jika meja ...
  • Dan mentransmisikan cadangan 100Gb melalui jaringan bukanlah apa yang saya sebut sepotong kue - khususnya jika jaringan (untuk beberapa alasan yang tidak diketahui) keras kepala saat menjatuhkan koneksi pada tanda 75Gb ... (terjadi pada instalasi saya sedang mengerjakan itu sedang mencadangkan ke drive yang dipetakan di jaringan - jaringan) ...

Dan apa tipe data yang harus dilakukan dengan itu? SEMUANYA. Menggunakan ukuran baris lebih besar dari yang diperlukan membuat halaman database mengisi sebelum daripada yang diperlukan atau bahkan membuang-buang ruang jika ukuran baris seperti itu bahwa tidak lebih dari satu catatan dapat direkam pada halaman. Hasilnya adalah lebih banyak halaman yang diperlukan untuk ditulis dan dibaca, lebih banyak RAM memori digunakan untuk cache itu (catatan yang lebih besar membutuhkan memori yang lebih besar). Dan karena tipe data Anda ditentukan lebih besar dari yang dibutuhkan dari disk, indeks Anda akan mengalami masalah yang sama - khususnya jika Anda mengelompokkan kunci primer 2 kolom COMINT komposit karena indeks lain yang dibuat akan menyalin kunci primer secara implisit pada definisi mereka.

Jika Anda tahu bahwa beberapa kolom dalam tabel yang akan memiliki jutaan baris atau bahkan sedikit tabel yang akan FK'ed untuk multi-juta-baris yang tidak memerlukan integer 4 byte untuk menyimpan data mereka, tetapi 2 byte akan suffice - use SMALLINT . Jika nilai dalam kisaran 0-255 sudah cukup, TINYINT . Bendera Ya/Tidak? Ada BIT .

13
Fabricio Araujo

Sedangkan untuk tinyint vs int ada perbedaan yang jelas seperti ruang disk, pemisahan halaman, dan waktu perawatan, tidak akan ada satu pun untuk varchar.

Jadi mengapa tidak mendeklarasikan semua bidang teks sebagai varchar(4000), karena bagaimanapun hanya akan menggunakan ruang yang dibutuhkan? Terlebih lagi Anda akan dijamin bahwa data Anda tidak akan pernah terpotong.

Jawabannya tentu saja:

  1. Klarifikasi niat Anda (karena tidak ada yang akan mengerti mengapa bidang nama harus 4000 karakter)
  2. Validasi karena Anda ingin memastikan tidak ada yang memasukkan seluruh biografi sebagai namanya.

Alasan yang sama juga berlaku untuk tinyint.

9
yoel halb