เป็นโมฆะหรือไม่เป็นค่าเริ่มต้น?


41

ใน MySQL จะดีกว่าหรือไม่ที่จะอนุญาตให้มีค่า Null เสมอเว้นแต่คุณจะรู้ว่าจำเป็นต้องใช้เขตข้อมูลหรือใช้เป็นประจำNot Nullเว้นแต่ว่าคุณรู้ว่าเขตข้อมูลจะมีค่า Null หรือไม่ หรือไม่สำคัญ

ฉันรู้ในบาง DBMS ที่พวกเขาบอกว่าใช้Not Nullให้มากที่สุดเพราะการอนุญาตให้มีค่า Null นั้นต้องใช้บิตเพิ่มเติม (หรือไบต์?) ต่อเรคคอร์ดเพื่อเก็บสถานะ Null


1
คุณควรอนุญาตNULLหากNULLค่านั้นมีการตีความสำหรับสิ่งที่คุณกำลังสร้างโมเดล
jameshfisher

คำตอบ:


25

ในฐานข้อมูลส่วนใหญ่NOT NULLคอลัมน์จะมีประสิทธิภาพมากขึ้นในแง่ของข้อมูลที่จัดเก็บด้วยเหตุผลที่คุณระบุและยังมีประสิทธิภาพในการสืบค้นและจัดทำดัชนี - ดังนั้นถ้าคุณต้องการอนุญาตให้ NULLs ในคอลัมน์คุณควรไม่อนุญาตอย่างชัดเจน

จะมีความหมายเกี่ยวกับประสิทธิภาพเล็กน้อยเนื่องจากNOT NULLข้อ จำกัดเพิ่มเติมอาจจำเป็นต้องถูกตรวจสอบสำหรับแต่ละแถวที่คุณส่งผลกระทบกับ INSERT หรือ UPDATE ใด ๆ แต่เนื่องจากฐานข้อมูลส่วนใหญ่มีความสัมพันธ์ในการเขียนและอ่านหนักซึ่งอาจไม่น่ากังวล เวลาพิเศษที่ใช้นั้นไม่น่าจะสังเกตได้เลยเพราะมันเป็นการทำงานของ CPU ที่การแทรก / อัปเดตส่วนที่เหลือจะเป็น IO-bound และขวดคอที่มีความสำคัญมากขึ้น) และให้คุณฟรี "การตรวจสอบข้อมูลเพื่อให้รหัสของคุณ (หรือรหัสของผู้อื่น) ไม่สามารถใส่ค่า NULL โดยไม่ได้ตั้งใจซึ่งรหัสอื่น ๆ ไม่ได้คาดหวังว่าจะได้รับผลลัพธ์ที่ไม่ถูกต้อง

แก้ไข: ปีเตอร์ชี้ให้เห็นในความคิดเห็นของเขาข้างต้นเป็นเรื่องทั่วไปและอาจไม่เป็นจริงสำหรับDMBSs ทั้งหมดแต่ฉันค่อนข้างแน่ใจว่ามันทำเพื่อ mysql และ mssql ภาวะแทรกซ้อนอื่น ๆ ในพื้นที่อาจรวมถึงคุณสมบัติต่างๆเช่นตารางที่กระจัดกระจาย (เช่น MSSQL 2008 เป็นต้นไป) ซึ่งจะเปลี่ยนแปลงการเปลี่ยนแปลงประสิทธิภาพของคอลัมน์ที่ไม่สามารถใช้ได้ (ไม่)


8
สิ่งนี้ไม่จำเป็นต้องเป็นจริงใน PostgreSQL คอลัมน์ Null ประหยัดพื้นที่ซึ่งสามารถปรับปรุงความเร็วได้และเวลาในการประมวลผลควรเท่ากัน
Peter Eisentraut

4
สิ่งนี้ไม่เป็นความจริงสำหรับ Oracle นอกจากนี้ซึ่งแตกต่างจาก MySql, Oracle ไม่ได้ทำดัชนีโมฆะเพื่อให้คุณสามารถลดขนาดของดัชนีของคุณโดยใช้พวกเขา ดูstackoverflow.com/questions/289001/does-mysql-index-null-values
Leigh Riffel

8

คุณควรให้ข้อกำหนดการออกแบบสคีมาและแอปพลิเคชันของคุณเป็นแนวทางในการตัดสินใจ ความแตกต่างของประสิทธิภาพอาจไม่ชัดเจนในกรณีส่วนใหญ่


3
อีกวิธีที่ดีที่สุดที่จะรู้แน่นอนคือการทำโปรไฟล์และการทดสอบ
jcolebrand

ฉันจะระมัดระวังด้วยคำแถลงที่กว้างขวาง - ถ้าคุณกำลังเขียน 10 ล้านแถวต่อคืนลงในตารางผ่านกระบวนการ ETL บางส่วนและตารางนั้นมีเขตข้อมูลที่ จำกัด ของ Null คุณจะเห็นผลกระทบต่อประสิทธิภาพ
ScottCher

1
+1: อาจไม่จริงสำหรับทุกแอปพลิเคชัน แต่สำหรับสิ่งที่ฉันทำรับข้อมูลที่ถูกต้อง / ถูกต้องมีความสำคัญมากกว่าประหยัดพื้นที่หรือสูญเสียความเร็ว
jp
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.