الاختلافات بين INDEX ، PRIMARY ، UNIQUE ، FULLTEXT في MySQL؟




indexing key (2)

ما هي الاختلافات بين PRIMARY و UNIQUE و INDEX و FULLTEXT عند إنشاء جداول MySQL؟

كيف أستخدمها؟


اختلافات

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

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

    قد يسمح نظام قاعدة البيانات الخاص بك بتطبيق فهرس فريد على الأعمدة التي تسمح بقيم NULL ، وفي هذه الحالة يتم السماح لصفين بالتطابق إذا كان كلاهما يحتوي على قيمة NULL (الأساس المنطقي هنا هو أن NULL تعتبر غير مساوية لنفسها). وبناءً على طلبك ، قد تجد هذا غير مرغوب فيه: إذا كنت ترغب في منع هذا ، يجب عدم السماح بقيم NULL في الأعمدة ذات الصلة.

  • يعمل الإصدار الأساسي تمامًا مثل فهرس فريد ، إلا أنه يدعى دائمًا باسم "PRIMARY" ، وقد يكون هناك واحد فقط على الطاولة ( ويجب أن يكون هناك دائمًا واحدًا ؛ على الرغم من أن بعض أنظمة قواعد البيانات لا تفرض ذلك). يُعد الفهرس الأساسي كوسيلة أساسية لتعريف أي صف في الجدول بشكل فريد ، لذلك بخلاف UNIQUE لا يجب استخدامه على أي أعمدة تسمح بقيم NULL. يجب أن يكون مؤشر PRIMARY على أصغر عدد من الأعمدة التي تكون كافية لتعريف صف بشكل فريد. غالبًا ما يكون هذا عمودًا واحدًا يحتوي على رقم إضافي فريد تلقائيًا ، ولكن إذا كان هناك أي شيء آخر يمكنه تحديد صف بشكل فريد ، مثل "countrycode" في قائمة البلدان ، فيمكنك استخدام ذلك بدلاً من ذلك.

    تقوم بعض أنظمة قواعد البيانات (مثل MySQL's InnoDB) بتخزين سجلات الجدول على القرص بالترتيب الذي تظهر به في فهرس PRIMARY.

  • تختلف مؤشرات FULLTEXT عن كل ما سبق ، ويختلف سلوكها بشكل كبير بين أنظمة قواعد البيانات. تعتبر الفهارس FULLTEXT مفيدة فقط في عمليات البحث عن النص الكامل التي تم إجراؤها مع جملة MATCH () / AGAINST () ، بخلاف الثلاثة المذكورة أعلاه - والتي يتم تطبيقها داخليًا باستخدام أشجار b (السماح للاختيار أو الفرز أو النطاقات بدءًا من أقصى العمود الأيسر) أو الجداول التجزئة (السماح للاختيار بدءا من معظم العمود الأيسر).

    وحيثما تكون أنواع الفهرس الأخرى ذات أغراض عامة ، فإن فهرس FULLTEXT متخصص ، من حيث أنه يخدم غرضًا ضيقًا: يُستخدم فقط لميزة "البحث عن النص الكامل".

التشابه

  • قد تحتوي كل هذه الفهارس على أكثر من عمود واحد فيها.

  • وباستثناء FULLTEXT ، يكون ترتيب الأعمدة مهمًا: لكي يكون الفهرس مفيدًا في استعلام ، يجب أن يستخدم الاستعلام أعمدة من الفهرس تبدأ من اليسار - لا يمكنه استخدام الجزء الثاني أو الثالث أو الرابع من الفهرس ، إلا إذا كان يستخدم أيضًا الأعمدة السابقة في الفهرس لمطابقة القيم الثابتة. (للحصول على فهرس FULLTEXT مفيدًا لاستعلام ، يجب أن يستخدم الاستعلام كافة أعمدة الفهرس.)


أشعر أن هذا قد تم تغطيته بشكل جيد ، ربما باستثناء ما يلي:

  • يعمل KEY / INDEX البسيط (أو ما يسمى بـ SECONDARY INDEX ) على زيادة الأداء إذا كانت الانتقائية كافية. في هذا الشأن ، تكون التوصية المعتادة هي أنه إذا كان مقدار السجلات في المجموعة التي تم تطبيق المؤشر عليها يتجاوز 20٪ من إجمالي عدد سجلات الجدول الأصلي ، فسيكون المؤشر غير فعال. في الممارسة العملية سوف تختلف كل بنية ، ولكن الفكرة لا تزال صحيحة.

  • يجب أن لا يمكن اعتبار فهارس ثانوية (وهو محدد جدًا إلى mysql) ككائنات منفصلة تمامًا ومختلفة عن المفتاح الأساسي. في الواقع ، يجب استخدام كليهما بشكل مشترك ، وبمجرد أن تعرف هذه المعلومات ، توفر أداة إضافية إلى قاعدة بيانات mysql: في Mysql ، تقوم الفهارس بتضمين المفتاح الأساسي. إنه يؤدي إلى تحسينات كبيرة في الأداء ، خاصة عند بناء مؤشرات ضمنية بشكل ذكي مثل وصفها هناك

  • إذا كنت تشعر بأن بياناتك يجب أن تكون UNIQUE ، فاستخدم فهرسًا فريدًا. قد تعتقد أنها اختيارية (على سبيل المثال ، العمل بها على مستوى التطبيق) وأن مؤشرًا عاديًا سيعمل ، ولكنه يمثل في الواقع ضمانة ل Mysql بأن كل صف فريد ، مما يوفر عرضًا للأداء.

  • يمكنك فقط استخدام FULLTEXT (أو ما يسمى بـ SEARCH INDEX ) مع Innodb (In MySQL 5.6.4 وما يليه) و Myisam Engines

  • يمكنك فقط استخدام FULLTEXT على أنواع الأعمدة CHAR و VARCHAR و TEXT
  • يتضمن مؤشر FULLTEXT LOT أكثر من مجرد إنشاء فهرس. هناك مجموعة من جداول النظام التي تم إنشاؤها ، ونظام تخزين مؤقت منفصل تمامًا وبعض القواعد والتحسينات المحددة المطبقة. انظر http://dev.mysql.com/doc/refman/5.7/en/fulltext-restrictions.html و http://dev.mysql.com/doc/refman/5.7/en/innodb-fulltext-index.html




schema