سؤال

أواجه مشكلة في تطوير تطبيق الويب وقد قمت بتطوير حل واحد لها، ولكنني أحاول العثور على أفكار أخرى قد تتغلب على بعض مشكلات الأداء التي أراها.

عرض المشكلة:

  • يقوم المستخدم بإدخال عدة كلمات رئيسية/رموز مميزة
  • يبحث التطبيق عن التطابقات مع الرموز المميزة
  • بحاجة إلى نتيجة واحدة لكل رمز مميز
    • على سبيل المثال، إذا كان الإدخال يحتوي على 3 رموز، فأنا بحاجة إلى معرف الإدخال 3 مرات
  • ترتيب النتائج
    • قم بتعيين نقاط X لمطابقة الرمز المميز
    • فرز معرفات الإدخال على أساس النقاط
    • إذا كانت قيم النقاط هي نفسها، استخدم التاريخ لفرز النتائج

ما أريد أن أكون قادرًا على فعله، ولكن لم أكتشفه، هو إرسال استعلام واحد يُرجع شيئًا مشابهًا لنتائج in()، ولكنه يُرجع معرف إدخال مكرر لكل رمز مطابق لكل معرف إدخال محدد.

هل هناك طريقة أفضل للقيام بذلك مما أفعله الآن، وهي استخدام استعلامات فردية متعددة لتشغيل استعلام واحد لكل رمز مميز؟إذا كان الأمر كذلك، ما هي أسهل طريقة لتنفيذ تلك؟

يحرر
لقد قمت بالفعل بترميز الإدخالات، لذلك، على سبيل المثال، يحتوي "see Spot Run" على معرف إدخال هو 1، وثلاثة رموز مميزة، "see"، و"spot"، و"run"، وهي موجودة في جدول رموز منفصل، مع معرفات الإدخال ذات الصلة بهم بحيث يبدو الجدول كما يلي:

'see', 1 
'spot', 1 
'run', 1 
'run', 2 
'spot', 3 
هل كانت مفيدة؟

المحلول

يمكنك تحقيق ذلك في استعلام واحد باستخدام "UNION ALL" في MySQL.

ما عليك سوى تكرار الرموز المميزة في PHP لإنشاء UNION ALL لكل رمز مميز:

على سبيل المثال، إذا كانت الرموز المميزة هي "x" و"y" و"z"، فقد يبدو استعلامك على هذا النحو

SELECT * FROM `entries` 
WHERE token like "%x%" union all 
    SELECT * FROM `entries` 
    WHERE token like "%y%" union all 
        SELECT * FROM `entries` 
        WHERE token like "%z%" ORDER BY score ect...

يجب أن تعمل جملة الأمر على مجموعة النتائج بأكملها كواحدة، وهو ما تحتاجه.

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

نصائح أخرى

أعلم أن هذا ليس إجابة صارمة على السؤال الذي تطرحه ولكن إذا كان جدولك يتكون من آلاف وليس ملايين الصفوف, ، فقد يكون حل FULLTEXT هو أفضل طريقة للذهاب إلى هنا.

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

انظر هنا:http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html

إذا كنت تستخدم نمط UNION ALL، فقد ترغب أيضًا في تضمين الأجزاء التالية في استعلامك:

SELECT COUNT(*) AS C
...
GROUP BY ID
ORDER BY c DESC

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

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

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