هل هناك أي سيناريو يمكن أن يؤثر فيه وجود فهرس واحد أو أكثر في الجدول؟

dba.stackexchange https://dba.stackexchange.com/questions/127345

سؤال

العنوان يلخص الأمر.

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

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

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

المحلول

حسنًا ، أعتقد أن لديك بعض المفاهيم المختلطة:

  1. يعمل الفهرس على تحسين أداء عمليات القراءة (تلك الخاصة بـ SELECT) مع زيادة وقت معالجة عمليات الإدخال / التحديث (لذلك لا يحسنون جميع عمليات CRUD ، كما سمعت).نظرًا لأنه في كل مرة تقوم فيها بإدراج صف جديد ، يجب عليك تحديث الفهرس ، إذا كان لديك عدد كبير جدًا من الفهارس ، فأنت تقوم بزيادة وقت عمليات الإدراج وأحيانًا التحديثات أيضًا (إذا كان التحديث يتضمن شيئًا مفهرسًا.

  2. يستخدم الفهرس مساحة ، ومساحة كبيرة إذا كان لديك الكثير من الصفوف.

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

    \ n \ n

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

    \ n \ n

    أيضًا ، يجب عليك اختبار كيفية قيام قاعدة البيانات الخاصة بك بتفسير الاستعلام والفهارس التي سيتم استخدامها (في MySQL ، يمكنك استخدام Explain ... والاستعلام الذي تختبره)

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

نصائح أخرى

قد يؤدي وجود عدد كبير جدًا من الفهارس بالفعل إلى حدوث مشكلات في الأداء.

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

في هذه الحالة ، قمنا بتقليل عدد الفهارس بشكل كبير عن طريق إزالة الفهارس من الأعمدة التي نادرًا ما يتم استخدامها.أدى هذا إلى تحسين أداء استفساراتنا بشكل كبير.

بالإضافة إلى ذلك ، تسببت الفهارس العديدة في (1) استخدام مساحة أكبر لتحقيق فائدة قليلة و (2) استهلاك المزيد من موارد الخادم للحفاظ على تحديث جميع الفهارس الزائدة .

لذا ، نعم ، يمكن أن تساعد الفهارس حقًا في أدائك ، ولكن عليك أن تكون منطقيًا في عدد ما تقوم بإنشائه.ركز على الفهارس التي تبدو مفيدة للغاية بالنسبة لك.

معلومات إضافية: يتضمن العديد من بائعي قواعد البيانات أدوات لمساعدتك في تحليل قيمة واستخدام الفهارس.فمثلا:

  1. يناقش MySQL - At http://dev.mysql.com/doc/refman/5.7/en/using-explain.html كيفية استخدام شرح لتحديد استخدام الفهارس.
  2. Postgresql - في http://www.postgresql.org/docs/9.1/static/monitoring-stats.html يحدد استخدام الإحصائيات في طرق عرض مثل pg_stat_user_indexes.
  3. Microsoft SQL Server - في https://msdn.microsoft.com/en-us/library/ms188755.aspx في عرض sys.dm_db_index_usage_stats الذي يُبلغ عن الإحصائيات مثل البحث والمسح والتحديثات والاستخدام الأخير.

محاولة البقاء محايدة في قاعدة البيانات:

القراءة والتصفية

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

إدخال

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

التحديث

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

حذف

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

باختصار

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

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

الكثير من الإجابات الجيدة بالفعل.أريد فقط أن أضيف قاعدة عامة وأسوأ سيناريو.

قاعدة عامة: إذا لم يتم استخدام فهرس بشكل متكرر بواسطة عملية SEEK ، فيمكن اعتباره "سيئًا" ، ويجب مراجعته أو إزالته.

السيناريو الأسوأ: يتكون الفهرس العنقودي في خادم sql من عمود GUID (غير متسلسل) ، وبالتالي قد تتسبب عمليات الإدراج المتكررة في إعادة تخصيص البيانات المادية.

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