سؤال

ماذا يفعل بالضبط null هل الأداء والتخزين (الفضاء) الحكمة في الخلية ؟

على سبيل المثال:

TINYINT:1 بايت TINYINT w/NULL 1 بايت + بطريقة أو بأخرى مخازن فارغة?

هل كانت مفيدة؟

المحلول

ذلك يعتمد على أي مشغل التخزين التي تستخدمها.

في MyISAM تنسيق كل صف رأس يحتوي على bitfield مع بت واحد لكل عمود في ترميز NULL الدولة.عمود هذا باطل لا يزال يأخذ مساحة كبيرة جدا فارغة لا تقلل من التخزين.انظر https://dev.mysql.com/doc/internals/en/myisam-introduction.html

في ك InnoDB, كل عمود يحتوي على حقل "تبدأ الأوفست" في صف الرأس الذي هو واحد أو اثنين بايت لكل عمود.عالية بعض الشيء في هذا المجال بدء تعويض على إذا كان العمود NULL.في هذه الحالة العمود لا تحتاج إلى تخزينها على الإطلاق.حتى إذا كان لديك الكثير من باطل هو التخزين الخاصة بك يجب أن تخفض بشكل كبير.انظر https://dev.mysql.com/doc/internals/en/innodb-field-contents.html

تحرير:

فارغة بت هي جزء من الصف رؤوس أنت لا تختار لإضافة لهم.

الطريقة الوحيدة التي يمكنني تخيل بالقيم الخالية تحسين الأداء في ك InnoDB, صفحة البيانات قد تناسب أكثر من الصفوف إذا كانت الصفوف تحتوي على القيم الخالية.حتى InnoDB المخازن المؤقتة قد تكون أكثر فعالية.

ولكن سأكون مندهشا للغاية إذا كان هذا يوفر ميزة كبيرة في الأداء في الممارسة العملية.القلق حول تأثير بالقيم الخالية على الأداء في مجال الصغرى الأمثل.يجب أن تركز انتباهك في مكان آخر ، في المناطق التي تعطي أكبر ضجة لباك.على سبيل المثال إضافة حسن اختيار المؤشرات أو زيادة قاعدة بيانات ذاكرة التخزين المؤقت تخصيص.

نصائح أخرى

بيل إجابة جيدة ، ولكن قليلا عفا عليها الزمن.استخدام واحد أو اثنين بايت لتخزين NULL ينطبق فقط أن ك InnoDB زائدة تنسيق الصف.منذ الخلية 5.0.3 يستخدم ك InnoDB المدمجة تنسيق الصف الذي يستخدم واحد فقط بت لتخزين NULL (طبعا بايت واحد هو الحد الأدنى) بالتالي:

المساحة المطلوبة بالقيم الخالية = السقف(ن/8) بايت حيث N هو عدد أعمدة فارغة في صف واحد.

  • 0 بالقيم الخالية = 0 بايت
  • 1 - 8 بالقيم الخالية = 1 بايت
  • 9 - 16 بالقيم الخالية = 2 بايت
  • 17 - 24 بالقيم الخالية = 3 بايت
  • الخ...

وفقا لمسؤول موقع الخلية عن الاتفاق vs زائدة:

الاتفاق تنسيق الصف يقلل صف مساحة التخزين بحوالي 20% في تكلفة زيادة استخدام وحدة المعالجة المركزية لبعض العمليات.إذا كان عبء العمل الخاص بك هو نموذجي واحد هو أن تقتصر من قبل ذاكرة التخزين المؤقت ضرب معدلات سرعة القرص المضغوط شكل من المرجح أن يكون أسرع.

الاستفادة من استخدام بالقيم الخالية على سلاسل فارغة أو الأصفار:

  • 1 NULL يتطلب 1 بايت
  • 1 سلسلة فارغة يتطلب 1 بايت (على افتراض VARCHAR)
  • 1 صفر يتطلب 4 بايت (على افتراض الباحث)

كنت تبدأ في رؤية المدخرات هنا:

  • 8 بالقيم الخالية تتطلب 1 بايت
  • 8 سلاسل فارغة تتطلب 8 بايت
  • 8 أصفار تتطلب 32 بايت

من ناحية أخرى, أقترح استخدام بالقيم الخالية على سلاسل فارغة أو الأصفار ، لأنهم أكثر تنظيما, المحمولة, و تتطلب مساحة أقل.لتحسين الأداء و توفير مساحة ، والتركيز على استخدام السليم أنواع البيانات و المؤشرات و الاستفسارات بدلا من الحيل الغريبة

أكثر على:https://dev.mysql.com/doc/refman/5.7/en/innodb-physical-record.html

أنا أتفق مع بيل Karwin ، على الرغم من أن وأود أن أضيف هذه الخلية نصائح.عدد 11 عناوين هذا على وجه التحديد:

أولا اسأل نفسك إذا كان هناك أي فرق بين وجود سلسلة فارغة قيمة مقابلقيمة فارغة (على الباحث المجالات:0 مقابلNULL).إذا كان هناك أي سبب أن يكون كلا, أنت لا تحتاج إلى حقل فارغ(هل تعلم أن أوراكل تعتبر لاغية و سلسلة فارغة كما يجري نفس الشيء؟)

أعمدة NULL تتطلب مساحة إضافية و يمكن إضافة التعقيد إلى مقارنة البيانات.فقط تجنب لهم عندما يمكنك.ولكن أنا أفهم أن بعض الناس قد يكون لها أسباب محددة للغاية أن يكون القيم NULL, وهو ليس دائما أمرا سيئا.

من ناحية أخرى, أنا لا تزال تستخدم فارغة على الجداول التي لا تحتوي على طن من الصفوف في الغالب لأنني أحب المنطق يقول غير فارغة.

التحديث إعادة النظر هذه في وقت لاحق ، وأود أن أضيف أنني شخصيا لا أحب استخدام 0 بدلا من فارغة في قاعدة البيانات, و أنا لا أنصح بذلك.وهذا يمكن أن يؤدي بسهولة إلى الكثير من ايجابيات كاذبة في التطبيق الخاص بك إذا لم تكن حذرا.

dev.mysql.com/doc/refman/ 5.0 / EN / غير-خالية optimization.html

والخلية يمكن أن تؤدي نفس التحسين على COL_NAME IS NULL أنه يمكن استخدامها لCOL_NAME = constant_value. على سبيل المثال، يمكن أن الخلية استخدام الفهارس وتتراوح للبحث عن NULL مع IS NULL

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top