it-swarm.asia

ما الفرق بين أنواع بيانات MySQL VARCHAR و TEXT؟

بعد الإصدار 5.0.3 (الذي سمح لـ VARCHAR أن يكون 65.535 بايت وإيقاف اقتطاع المسافات الزائدة) ، هل هناك فرق كبير بين هذين النوعين من البيانات؟

كنت أقرأ قائمة الاختلافات واثنين فقط من المذكرة هي:

بالنسبة إلى الفهارس في أعمدة BLOB و TEXT ، يجب تحديد طول بادئة الفهرس. بالنسبة لـ CHAR و VARCHAR ، يكون طول البادئة اختياريًا. انظر القسم 7.5.1 ، "فهارس الأعمدة".

و

لا يمكن أن تحتوي أعمدة BLOB و TEXT على قيم افتراضية.

لذا ، بسبب هذين التقييدين على نوع بيانات TEXT ، فلماذا تستخدمه عبر varchar (65535)؟ هل هناك تداعيات على الأداء على الآخر؟

19
Derek Downey

مقسم مرتبط ببعض المعلومات التي توضح المشكلة الأساسية (هناك اختلافات في الأداء) ، ولكن ليس من السهل أن نقول أن أحدهما أفضل دائمًا من الآخر. (وإلا فلن يكون هناك سبب لكليهما.) أيضًا ، في MyISM ، لا يبلغ الحد الأقصى للحجم البالغ 64 كيلو بايت لـ VARCHAR لكل حقل - إنه لكل سجل.

في الأساس ، هناك 4 طرق لتخزين السلاسل في سجلات قاعدة البيانات:

  1. طول ثابت
  2. سلاسل على شكل حرف C (مميزة بحرف NULL أو حرف مشابه في نهاية السلسلة)
  3. سلاسل نمط باسكال (بضع بايت للإشارة إلى الطول ، ثم السلسلة)
  4. مؤشرات (تخزين السلسلة في مكان آخر)

يستخدم MyISM شيئًا مشابهًا لـ # 3 لـ VARCHAR ، ونهج هجين لـ TEXT حيث يقوم بتخزين بداية السلسلة في السجل ، ثم بقية السلسلة في مكان آخر. يتشابه InnoDB مع VARCHAR ، ولكنه يخزن حقل TEXT الكامل خارج السجل.

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

إذا كنت بحاجة بالفعل إلى قراءة السلسلة ، فإن # 4 أبطأ ، حيث يتعين عليك قراءة السجل ، ثم قراءة السلسلة التي قد يتم تخزينها في مكان آخر على القرص ، اعتمادًا على كيفية معالجة قاعدة البيانات لها. # 1 دائمًا ما يكون واضحًا ومباشرًا ، ومرة ​​أخرى تواجه مشكلات مماثلة حيث يصبح الرقم 2 أسوأ كلما كانت السلسلة أطول ، في حين أن الرقم 3 أسوأ قليلاً من رقم 2 للسلاسل الصغيرة جدًا ، ولكنه أفضل لأنه يصبح أطول.

ثم هناك متطلبات التخزين ... رقم 1 دائمًا ما يكون طولًا ثابتًا ، لذلك قد يكون منتفخًا إذا لم تكن معظم السلاسل هي الطول الأقصى. # 2 لديه بايت واحد إضافي ؛ يحتوي # 3 عادةً على 2 بايت إضافية إذا كان الحد الأقصى للطول = 255 ، و 4 بايت إضافي إذا كان 64 كيلو بايت كحد أقصى. # 4 له طول المؤشر ، بالإضافة إلى قواعد # 3 عادة.

للتطبيقات المحددة ضمن MySQL 5.1 ، (مستندات لحالة MyISM :

  • دعم لنوع VARCHAR حقيقي ؛ يبدأ عمود VARCHAR بطول مخزّن في بايت واحد أو وحدتي بايت.
  • قد تحتوي الجداول ذات أعمدة VARCHAR على طول صف ثابت أو ديناميكي.
  • قد يصل مجموع أطوال أعمدة VARCHAR و CHAR في جدول إلى 64 كيلو بايت.

بينما لـ InnoDB :

  • يحتوي الجزء المتغير الطول لرأس السجل على متجه بت للإشارة إلى الأعمدة الفارغة. إذا كان عدد الأعمدة في الفهرس التي يمكن أن تكون فارغة (NULL) هو N ، فسيشغل متجه البت بايت CEILING (N/8) بايت. (على سبيل المثال ، إذا كان هناك ما بين 9 إلى 15 عمودًا يمكن أن يكون فارغًا ، يستخدم ناقل البت وحدتي بايت.) لا تشغل الأعمدة التي تكون فارغة (NULL) مساحة غير البت في هذا المتجه. يحتوي جزء الطول المتغير للرأس أيضًا على أطوال أعمدة متغيرة الطول. يأخذ كل طول بايت أو وحدتي بايت ، اعتمادًا على الحد الأقصى لطول العمود. إذا كانت جميع الأعمدة في الفهرس ليست خالية ولها طول ثابت ، فلن يحتوي رأس السجل على جزء متغير الطول.
  • لكل حقل غير متغير الطول ، يحتوي رأس السجل على طول العمود في بايت واحد أو وحدتي بايت. ستكون هناك حاجة إلى وحدتي بايت فقط إذا تم تخزين جزء من العمود خارجيًا في صفحات تجاوز السعة أو تجاوز الحد الأقصى للطول 255 بايت وتجاوز الطول الفعلي 127 بايت. بالنسبة للعمود المخزن خارجيًا ، يشير الطول ثنائي البايت إلى طول الجزء المخزن داخليًا بالإضافة إلى مؤشر 20 بايت إلى الجزء المخزن خارجيًا. الجزء الداخلي هو 768 بايت ، لذا الطول 768 + 20. يخزن المؤشر 20 بايت الطول الحقيقي للعمود.

...

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

13
Joe

عندما يحتاج SELECT إلى إنشاء جدول مؤقت (مثل فرز النتائج) ، فسوف يقوم إما بإنشاء جدول MEMORY أو جدول MyISAM. MEMORY أكثر كفاءة. هناك قيود على MEMORY - أحدها هو منع TEXT و BLOB. لذلك ، فإن SELECT قد يعمل بشكل أبطأ مع TEXT من VARCHAR.

2
Rick James