NULL atau NOT NULL secara default?


41

Di MySQL, apakah lebih baik selalu mengizinkan nol kecuali Anda tahu bidang wajib diisi, atau selalu gunakan Not Nullkecuali Anda tahu bidang akan berisi nol? Atau tidak masalah?

Saya tahu dalam beberapa DBMS mereka mengatakan untuk menggunakan Not Nullsebanyak mungkin karena mengizinkan nol membutuhkan sedikit tambahan (atau byte?) Per catatan untuk menyimpan status Null.


1
Anda harus mengizinkan NULLjika dan hanya jika NULLnilainya memiliki interpretasi untuk hal yang Anda modelkan.
jameshfisher

Jawaban:


25

Di sebagian besar DB, NOT NULLkolom akan lebih efisien dalam hal data yang disimpan karena alasan Anda menyatakan, dan juga lebih efisien untuk kueri dan indeks - jadi kecuali jika Anda ingin mengizinkan NULL dalam kolom, Anda harus melarangnya secara eksplisit.

Akan ada sedikit implikasi kinerja, karena NOT NULLkendala tambahan akan berpotensi perlu diperiksa untuk setiap baris yang Anda pengaruhi dengan INSERT atau UPDATE apa pun, tetapi karena sebagian besar basis data relatif ringan dan ringan, ini mungkin bukan masalah (kecil bagaimanapun juga, waktu tambahan tidak akan terlihat sama sekali karena ini adalah operasi yang terikat CPU di mana sisa operasi insert / update akan terikat IO dan jadi jauh lebih penting dibandingkan dengan botol-neck) dan itu memberi Anda beberapa "gratis "pengecekan data sehingga kode Anda (atau kode orang lain) tidak dapat secara tidak sengaja meletakkan NULL di mana kode lain tidak mengharapkannya dan karenanya dapat memberikan hasil yang salah di hadapan mereka.

Sunting: Seperti yang ditunjukkan Peter dalam komentarnya di atas adalah generalisme dan mungkin tidak berlaku untuk semua DMBS, meskipun saya cukup yakin itu berlaku untuk mysql dan mssql. Komplikasi lain di area ini mungkin termasuk fitur seperti tabel jarang (seperti yang diterapkan MSSQL 2008 misalnya) yang akan mengubah dinamika kinerja kolom (tidak) yang dapat dibatalkan.


8
Ini belum tentu benar di PostgreSQL. Kolom kosong menghemat ruang, yang dapat meningkatkan kecepatan, dan waktu pemrosesan harus hampir sama.
Peter Eisentraut

4
Ini juga tidak berlaku untuk Oracle. Selain itu, tidak seperti MySql, Oracle tidak mengindeks nol sehingga Anda dapat mengurangi ukuran indeks Anda menggunakannya. Lihat stackoverflow.com/questions/289001/does-mysql-index-null-values
Leigh Riffel

8

Anda harus membiarkan desain skema dan persyaratan aplikasi memandu keputusan ini. Perbedaan kinerja mungkin tidak terlihat pada kebanyakan kasus.


3
Sekali lagi, cara terbaik untuk mengetahui dengan pasti adalah profil dan pengujian.
jcolebrand

Saya akan berhati-hati dengan pernyataan luas seperti itu - jika Anda menulis 10 juta baris semalam ke dalam tabel melalui beberapa proses ETL dan tabel itu memiliki banyak bidang yang tidak dibatasi Null, Anda akan melihat dampak kinerja.
ScottCher

1
+1: Mungkin itu tidak benar untuk semua aplikasi, tetapi untuk apa yang saya lakukan mendapatkan data yang konsisten / benar lebih penting daripada menghemat ruang atau kehilangan beberapa kecepatan.
jp
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.