سؤال

هل يعرف أحد ما هو التعقيد بالنسبة لـ SQL LIKE مشغل لقواعد البيانات الأكثر شعبية؟

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

المحلول

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

LIKE 'foo%' سريع إذا تم تشغيله على عمود مفهرس. تعد فهارس MySQL أحد أشكال أشجار B، لذلك عند إجراء هذا الاستعلام، يمكن ببساطة نزول الشجرة إلى العقدة المقابلة لـ foo, ، أو العقدة الأولى بهذه البادئة، ثم قم باجتياز الشجرة للأمام.كل هذا فعال للغاية.

LIKE '%foo' لا يمكن تسريعها بواسطة الفهارس وسيؤدي إلى فحص كامل للجدول. إذا كانت لديك معايير أخرى يمكن تنفيذها باستخدام الفهارس، فسوف تقوم فقط بفحص الصفوف المتبقية بعد التصفية الأولية.

هناك خدعة بالرغم من ذلك:إذا كنت بحاجة إلى مطابقة اللاحقة - ابحث عن أسماء الملفات ذات الامتداد .foo, على سبيل المثال - يمكنك تحقيق نفس الأداء عن طريق إضافة عمود بنفس محتويات العمود الأصلي ولكن مع الأحرف بترتيب عكسي.

ALTER TABLE my_table ADD COLUMN col_reverse VARCHAR (256) NOT NULL;
ALTER TABLE my_table ADD INDEX idx_col_reverse (col_reverse);
UPDATE my_table SET col_reverse = REVERSE(col);

البحث عن الصفوف مع col تنتهي في .foo ثم يصبح:

SELECT * FROM my_table WHERE col_reverse LIKE 'oof.%'

وأخيرا، هناك LIKE '%foo%', ، والتي لا توجد اختصارات لها. إذا لم تكن هناك معايير تقييد أخرى تقلل من عدد الصفوف إلى عدد ممكن، فسوف يتسبب ذلك في حدوث أداء صعب.قد ترغب في التفكير في حل للبحث عن النص الكامل بدلاً من ذلك، أو بعض الحلول المتخصصة الأخرى.

نصائح أخرى

إذا كنت تسأل عن تأثير الأداء:

ومشكلة مثل هو أنه يحافظ على قاعدة بيانات من استخدام فهرس. على أوراكل أعتقد أنه لا يستخدم الأرقام القياسية بعد الآن (ولكن ما زلت على أوراكل 9). يستخدم SQLSERVER الفهارس إذا كان البدل فقط في نهاية المطاف. أنا لا أعرف عن قواعد البيانات الأخرى.

ويعتمد على RDBMS، والبيانات (وربما حجم البيانات)، والفهارس وكيفية استخدام مثل (مع أو بدون البدل اختصار)!

أنت تسأل العام أيضا سؤال.

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