تمت إضافة ميزة جديدة في مايو Selective dismissal of New and Unread topics. قمنا مؤخرًا بالترقية إلى أحدث إصدار من Discourse، وعند فحص الكود وسجلات قاعدة البيانات لدينا، يبدو أنه عندما يقوم المستخدمون بـ “إخفاء الجديد” دون تحديد (أي إخفاء جماعي فقط)، فإننا نمرر tracked = false ولا شيء آخر في معلمات الطلب لإعادة تعيين الجديد.
وبسبب عدم تمرير أي معرفات للموضوعات (topic_ids)، نتجاوز جملة الشرط (if statement) وننتقل تلقائيًا إلى السطر 989.
ندير خادم Discourse كبير نسبيًا، وأعتقد أن فكرة وجود جميع الموضوعات ببساطة مكلفة جدًا، حيث أن الاستعلام يولد تقريبًا:
LEFT JOIN topic_users ON topic_users.topic_id = topics.id AND topic_users.user_id = xxx WHERE "topics"."deleted_at" IS NULL AND "topics"."id" IN (1, ... 1000000) AND (topics.created_at >= 'date') AND (topic_users.last_read_post_number IS NULL) AND (topics.archetype <> 'private_message') ORDER BY topics.created_at DESC LIMIT 500
أعتقد أن جملة IN تحتوي على تقريبًا كل موضوع واحد في نطاق المليون+.
هل يمكننا جعل الاختيار الجماعي الافتراضي يمرر معرفات الموضوعات فقط بدلاً من الافتراض بوجود جميع الموضوعات الممكنة؟
@مارتين، آسف على الإشعار، يبدو أنك قمت بدفع الالتزام المذكور أعلاه.
هل يمكنك التحقق مما إذا كان هذا يبدو دقيقًا كسبب جذري لما نلاحظه؟ فنحن نرى قوائم تصفية ضخمة في الاستعلامات (حوالي مليون معرف موضوع) في الحالة الافتراضية لـ “إغلاق الكل الجديد”. (يضيف منتدى لدينا آلاف مواضيع Discourse)
يمكننا المساعدة في تقديم طلب سحب (PR) لحل المشكلة إذا لم تكن لدى فريق Discourse أولوية لذلك، لكنني أشك في أننا المتأثرون الوحيدون بهذا، وقد يؤثر أيضًا على أداء قاعدة البيانات لبعض عملائك.
شكرًا لك @forkythetoy و @Hooksmith على لفت انتباهي إلى هذا الأمر. لقد تأكدت من أن هذا استعلام ضخم حتى هنا في الميتا. سأكتب إصلاحًا لهذا الأمر اليوم، ويجب أن يكون الأمر بسيطًا مثل استخدام معرفات المواضيع (topic IDs) للمواضيع التي تظهر فقط في قائمة “الجديد” للمستخدم، بدلاً من جميع المواضيع على الإطلاق. سأعود للنشر هنا عندما يكون لدي التصحيح.