يتحكم متغير نظام MAX_SEEKS_FOR_KEY في MYSQL في عتبة تتعلق بعملية صنع القرار المُحسّنة عند اختيار ما إذا كنت تريد استخدام فحص الفهرس أو فحص جدول كامل. يحمل تعيين MAX_SEEKS_FOR_KEY عالية جدًا العديد من المخاطر التي يمكن أن تؤثر على أداء وكفاءة الاستعلامات في قاعدة بيانات MySQL.
يمثل max_seeks_for_key العدد الأقصى المفترض للمفتاح الذي يسعى إلى تحسينه عند البحث عن صف استنادًا إلى مفتاح الفهرس. بشكل افتراضي ، تكون هذه القيمة مرتفعة للغاية (على نظام 64 بت ، وعادة ما يتم ضبطها على 18،446،744،073،709،551،615). هذا يعني أن المُحسِّن لن يحد نفسه في افتراض مدى تكلفة البحث عن المفتاح بواسطة الفهرس.
عندما يتم تعيين MAX_SEEKS_FOR_KEY عالية جدًا ، يميل المحسن إلى تفضيل فحوصات الجدول على فحوصات الفهرس ، خاصة في الحالات التي يكون فيها عهد الفهرس (العدد المقدر للقيم الفريدة في الفهرس) منخفضًا نسبيًا. هذا يمكن أن يؤدي إلى عدة عواقب غير مرغوب فيها:
1. خطط الاستعلام دون المستوى الأمثل:
إن الخطر الأكثر أهمية في وجود MAX_SEEKS_FOR_KEY هو أن محسن الاستعلام قد يختار عمليات مسح الجدول الكاملة بدلاً من عمليات مسح فهرس أكثر كفاءة. اقرأ عمليات مسح الجدول الكاملة كل صف في الجدول بالتتابع ، مما قد يؤدي إلى ارتفاع تكاليف الإدخال/الإخراج إذا كان الجدول كبيرًا ويحتاج الاستعلام فقط إلى مجموعة فرعية صغيرة من الصفوف. هذا يؤدي إلى أوقات تنفيذ الاستعلام أبطأ مقارنة باستخدام فحص فهرس مناسب.
2. زيادة استخدام الموارد والكمون:
غالبًا ما تستهلك عمليات مسح الجدول الكاملة المزيد من موارد وحدة المعالجة المركزية والقرص الإدخال/الإخراج لأنه يجب فحص كل صف في الجدول. يمكن أن يساهم ذلك في تحميل النظام بشكل عام ، وزيادة زمن الوصول للاستعلامات ، وتقليل الإنتاجية لخادم MySQL ، وخاصة تحت تزامن المستخدم العالي أو مع مجموعات بيانات كبيرة جدًا.
3. الأداء الضعيف على الطاولات الكبيرة:
نظرًا لأن عمليات المسح الكاملة تتطلب قراءة الجدول بأكمله ، فإن تعيين MAX_SEEKS_FOR_KEY يؤثر بشكل كبير على الأداء سلبًا للجداول الكبيرة مع العديد من الصفوف. الاستعلامات التي يجب أن تستفيد بشكل مثالي من الفهارس لتصفية الصفوف بسرعة بدلاً من ذلك ، تتكبد فترات مسح طويلة ، ومهينة استجابة التطبيق.
4. سلوك غير متناسق عبر الاستفسارات:
لأن max_seeks_for_key ينطبق على مستوى العالم ، فإن زيادة قيمتها تؤثر على جميع الاستعلامات على الخادم. على الرغم من أن بعض الاستعلامات قد تستفيد من عمليات المسح الكاملة ، إلا أن العديد من الآخرين قد تم تحسينهم للفهارس قد يكون أداءً أسوأ. هذا يجلب عدم القدرة على التنبؤ وأداء الاستعلام غير المتناسق ، مما يتطلب تجربة وضبط محددة للاستعلام.
5. الفشل في الاستفادة من Cardinality الفهرس بشكل فعال:
Cardinality الفهرس (تقدير القيم المتميزة في الفهرس) هو مفتاح قرارات MySQL Optimizer. إذا تم تعيين MAX_SEEKS_FOR_KEY عالية جدًا ، فإن المحسن يعاقب فهرس الفهرس من خلال افتراض أنه قد يتطلب البحث عن مفتاح أكثر تكلفة مما يفعله بالفعل ، حتى عندما يجب استخدام فهارس القلب العالية بشكل منطقي. وبالتالي ، فإن التحسينات القائمة على الفهرس غير مستغلة أو تجاهلها.
6. إحصائيات مُحسّنة مضللة:
يعتمد المُحسّن على الإحصاءات مثل Cardinality الفهرس والتكاليف المرتبطة بالبحث عن الصف. عندما يقوم max_seeks_for_key بإقناع التكلفة الفعلية من خلال كونه متساهلاً بشكل مفرط ، يمكن أن يتسبب ذلك في إساءة تقدير تكلفة مسارات الوصول ، مما يؤثر على دقة نموذج التكلفة الإجمالية للمحسّن.
7. صعوبة استكشاف الأخطاء وإصلاحها في الأداء:
نظرًا لأن MAX_SEEKS_FOR_KEY يمكنه التفاعل بطرق معقدة مع إحصائيات الفهرس وخطط الاستعلام ، فإن جعلها عالية جدًا يمكن أن تجعل تشخيص الاستعلامات البطيئة أكثر تحديا. قد يؤدي ذلك إلى مواقف لا تؤدي فيها فهارس الضبط أو إعادة كتابة الاستعلامات إلى تحسينات متوقعة لأن افتراضات التكلفة الأساسية في المُحسّنة تظل منحرفة.
ملخص للمخاطر: يؤدي تعيين MAX_SEEKS_FOR_KEY إلى ارتفاع مُحسِّن MYSQL لصالح عمليات مسح الجدول الكاملة بدلاً من عمليات مسح الفهرس ، مما يؤدي إلى أوقات تنفيذ أبطأ ، وزيادة وحدة المعالجة المركزية وتحميل I/O ، والاستخدام غير الفعال للمؤشرات ، والأداء المتدهور على الجداول الكبيرة ، وسلوك الاستعلام غير المتناسق ، وتقديرات تكلفة الخلل من خلال التحديات المحسنة في المصادقة في الأداء.
تبرز هذه المخاطر لماذا تختار العديد من DBAs تقليل MAX_SEEKS_FOR_KEY إلى مستوى أكثر اعتدالًا (مثل 1000 أو ما شابه). يشجع خفض القيمة المُحسّن على تفضيل استخدام الفهرس على عمليات المسح الكامل عندما تكون Cardinality الفهرس أعلى من تلك العتبة ، وعادة ما يحسن سرعة الاستعلام وتقليل استهلاك الموارد لأعباء العمل النموذجية.
في الختام ، على الرغم من أن MAX_SEEKS_FOR_KEY مرتفع للغاية قد لا يقيد المحسن ، في الممارسة العملية ، فإنه يخاطر بأداء الاستعلام السيئ ، والموارد المهدرة ، والكمون الأعلى بسبب عمليات مسح الطاولة المبكرة ، وخاصة على مجموعات البيانات الكبيرة التي يجب فهرستها بكفاءة.