بالنسبة لجدول innodb في MySQL، وهو أسرع:فارشار (255) أو نص صغير؟

StackOverflow https://stackoverflow.com/questions/1068825

سؤال

أنا أقوم بتحسين بعض جداول إينودب في MySQL، لذلك ركضت تحليل الإجراء () لنرى ما هي التوصيات.

النتائج الموصى بها نص صغير بدلاً من varchar(255) لجميع الحقول التي تم إعدادها مسبقًا كـ varchar(255)

هل يوجد مكاسب الأداء يمكن الحصول عليها باستخدام com.tinytext؟أنا مهتم فقط بالسرعة هنا، وليس بالحجم.

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

المحلول

لا تصدق إذا أخبرك أي شخص أن TINYTEXT يتم تخزينه بطريقة أخرى غير VARCHAR.

الاختلافات الفعلية هي:

  • يتم تخزين TINYTEXT وحقول TEXT الأخرى بشكل منفصل عن صف الذاكرة داخل كومة MySQL، بينما تضيف حقول VARCHAR() ما يصل إلى 64 كيلو بايت (لذا يمكنك الحصول على أكثر من 64 كيلو بايت في TINYTEXTs، بينما لن تفعل ذلك مع VARCHAR).

  • ستجبر TINYTEXT وغيرها من الحقول "الشبيهة بالنقطة" طبقة SQL (MySQL) على استخدام الجداول المؤقتة على القرص كلما تم استخدامها، بينما سيظل VARCHAR مصنفًا "في الذاكرة" (على الرغم من أنه سيتم تحويله إلى CHAR للعرض الكامل) .

  • لا يهتم InnoDB داخليًا حقًا بما إذا كان نصًا صغيرًا أو varchar.من السهل جدًا التحقق وإنشاء جدولين، أحدهما باستخدام VARCHAR(255)، والآخر باستخدام TINYINT، وإدراج سجل في كليهما.سيأخذ كلاهما صفحة واحدة بحجم 16 كيلو بايت - بينما إذا تم استخدام الصفحات الفائضة، فيجب أن يظهر جدول TINYTEXT على أنه يأخذ 32 كيلو بايت على الأقل في "إظهار حالة الجدول".

أفضّل عادةً VARCHAR(255) - فهي لا تسبب الكثير من تجزئة الكومة لصف واحد، ويمكن معاملتها ككائن واحد بحجم 64 كيلو بايت في الذاكرة داخل MySQL.في InnoDB، تكون اختلافات الحجم ضئيلة.

نصائح أخرى

أتوقع أن يكون varchar أسرع من tinytext، ومن خلال بحثي على Google يبدو أن هذا هو الإجماع العام.بالطبع سيتعين عليك اختبار النظام الخاص بك للتأكد حقًا.

السبب وراء سرعته هو أنه عندما يقوم MySQL بأنواع معينة من العمليات (الانضمام، والفرز، وما إلى ذلك)، فإنه غالبًا ما يقوم بإنشاء جداول مؤقتة.عندما يكون لديك نوع BLOB (مثل نص صغير) في جدول مؤقت، سيكون الجدول قائمًا على القرص بدلاً من الذاكرة، وهو ما سيكون له بالطبع تأثير على الأداء.

سيكون CHAR/VARCHAR أسرع حيث يتم تخزين هذه الأعمدة في نفس الصفحة مثل بيانات الصف الرئيسي*، بينما يتم تخزين أنواع TEXT خارج الصفحة (كنت مخطئا، انظر تعليق هاريسون).

اعتاد الناس على استخدام tinytext كثيرًا لأن varchar (بشكل مزعج) قلص المسافات البيضاء الزائدة.تمت إزالة هذا السلوك في MySQL 5.0.

(* على الأقل بالنسبة لأول 768 بايت، ومع InnoDB المدمج، وليس المكون الإضافي InnoDB الجديد).

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

ومع ذلك، ملاحظة:لن يسمح MySQL varchar و char الأنواع الموجودة في نفس الجدولكما أنها لا تسمح [عادةً] بإجراء مقارنات بين varchar و char.لقد اكتشفت ذلك العام الماضي عند القيام بتنفيذ جدول لهواية مشروع.

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