سؤال

لدي موقع حيث يمكن للمستخدمين عرض عدد كبير جدا من الوظائف.كل مرة يتم تشغيل استعلام مشابهة UPDATE table SET views=views+1 WHERE id = ?.ومع ذلك ، هناك عدد من مساوئ هذا النهج:

  • لا توجد طريقة تتبع عند مشاهدة تحدث - فهي ببساطة زيادة.
  • تحديث الجدول الذي غالبا ما بقدر أفهم واضحة الخلية ذاكرة التخزين المؤقت من الصف ، مما يجعل حدد المقبل من هذا الصف أبطأ.

ولذلك أنا أعتبر توظيف النهج أين يمكنني إنشاء جدول, يقول:
object_views { object_id, year, month, day, views }, حتى أن كل كائن له صف واحد pr.اليوم في هذا الجدول.ثم بشكل دوري تحديث آراء عمود في objects الجدول حتى لا تضطر إلى القيام مكلفة ينضم في كل وقت.

هذا هو أبسط حل أستطيع أن أفكر ، ويبدو أنه هو أيضا واحد مع أقل تأثير على الأداء.هل توافق على ذلك ؟

(الموقع بناء على PHP 5.2, symfony 1.4 والفقه 1.2 في حال كنت أتساءل)

تحرير:
والغرض من ذلك هو لا تحليلات الويب - أنا أعرف كيف نفعل ذلك, وهذا هو بالفعل في المكان.هناك غرضين:

  • تسمح للمستخدم لمعرفة عدد مرات معين كائن وقد تبين على سبيل المثال اليوم أو أمس.
  • تسمح المشرفين على الموقع لمعرفة بسيطة عرض إحصاءات دون الخوض في Google Analytics ، Omniture أو أي حل.وعلاوة على ذلك ، فإن النتائج في الخلفية يجب أن تكون الحقيقي, ميزة اللي تبونه GA لا يمكن أن تقدم في هذا الوقت.أنا لا ترغب في استخدام تحليلات API لاسترداد بيانات الاستخدام (لا الوقت الحقيقي, GA يتطلب جافا سكريبت).
هل كانت مفيدة؟

المحلول

اقتباس :تحديث الجدول الذي غالبا ما بقدر أفهم واضحة الخلية ذاكرة التخزين المؤقت من الصف ، مما يجعل حدد المقبل من هذا الصف أبطأ.
هناك ما هو أكثر بكثير من هذا.هذا هو القاتل قاعدة البيانات.أقترح u جعل الجدول مثل هذا :object_views { object_id, الطابع الزمني} بهذه الطريقة يمكنك الكلي على object_id (count() وظيفة).لذلك في كل مرة شخص ما عرض الصفحة سوف إدراج سجل في الجدول.مرة واحدة في حين يجب تنظيف السجلات القديمة في الجدول.تحديث البيان الشر :) على معظم المنصات وسوف أساسا مارك الصف كما حذف وإدراج واحدة جديدة مما يجعل الطاولة مجزأة.ناهيك عن تأمين القضايا .

على أمل أن يساعد

نصائح أخرى

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

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

أولاً مجرد ملاحظة سريعة لماذا لا يتم تجميع العام والشهر واليوم DATETIME, ، سيكون الأمر أكثر منطقية في ذهني.

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

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

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

أحد الحلول الممكنة الأخرى أيضًا هو الاستخدام com.memcached, ، يوفر البرنامج الخفي نوعًا من العداد الذي يمكنك القيام به زيادة راتب.يمكنك تسجيل الدخول هناك والحصول على برنامج نصي يجمع النتيجة كل يوم.

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

فيما يتعلق بمسألة التاريخ والوقت، يمكنك دائمًا استخدام GROUP BY MONTH( accessed_at ) , YEAR( accessed_at) أو WHERE MONTH(accessed_at) = 11 AND YEAR(accessed_at) = 2009.

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