ما أسرع ؛ بما في ذلك ملف آخر أو الاستعلام عن قاعدة بيانات MySQL في PHP?

StackOverflow https://stackoverflow.com/questions/166134

سؤال

في PHP, وهو أسرع ؛ باستخدام include('somefile.php') أو الاستعلام عن قاعدة بيانات MySQL مع بسيطة SELECT الاستعلام للحصول على نفس المعلومات ؟

على سبيل المثال لنفترض أن لديك جافا سكريبت الإكمال التلقائي البحث الميداني الذي يحتاج إلى 3,000 حيث أن المباراة ضد.هو أسرع في قراءة هذه الشروط في من ملف آخر باستخدام include أو القراءة عليها من قاعدة بيانات MySQL باستخدام بسيط SELECT الاستعلام?

تحرير: هذا على افتراض أن قاعدة البيانات وملف أريد أن تدرج على نفس الجهاز المحلي مثل قانون بلدي.

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

المحلول

ذلك يعتمد.إذا كان الملف الخاص بك المخزنة محليا في خادم قاعدة البيانات المثبتة في جهاز آخر ، ثم أسرع إلى إدراج الملف.

Buuuuut ، لأنه يعتمد على النظام الخاص بك يمكن أن يكون غير صحيح.أقترح عليك أن تجعل PHP النصي الاختبار وتشغيله 100 مرة من سطر الأوامر, و كرر الاختبار عبر HTTP (باستخدام الضفيرة)

على سبيل المثال:

use_include.php

<?php

  start = microtime(true);

  include( 'somefile.php' );

  echo microtime(true)-start;

?>

use_myphp.php

<?php

  start = microtime(true);

  __put_here_your_mysql_statements_to_retrieve_the_file__

  echo microtime(true)-start;

?>

نصائح أخرى

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

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

إذا كنت تسير الخلية الطريق قلقون بسرعة ثم استخدام التخزين المؤقت.

$query = $_GET['query'];
$key = 'query' . $query;
if (!$results = apc_fetch($key))
{ 
    $statement = $db->prepare("SELECT name FROM list WHERE name LIKE :query");
    $statement->bindValue(':query', "$query%");
    $statement->execute();
    $results = $statement->fetchAll();
    apc_store($key, $results);
}

echo json_encode($results);

الفرق في الوقت هو أكثر وصولا إلى تصميم النظام من وراء هذه التقنية كنت أجرؤ على القول.سواء الخلية نتيجة الملف يمكن أن يكون مؤقتا في الذاكرة, و الفارق في الأداء لن يكون هناك صغيرة جدا فمن neglectable.

بدلا من ذلك كنت أسأل نفسي ما الفرق في صيانة سيكون.هل من المحتمل أن تغير من أي وقت مضى البيانات ؟ إذا لا, فقط ضعه في ملف عادي.هل من المحتمل أن تغيير أجزاء من المحتوى من أي وقت مضى في كثير من الأحيان ؟ إذا كان الأمر كذلك ، قاعدة بيانات أسهل طريقة للتلاعب.نفس الشيء بالنسبة هيكل البيانات ، إذا كان يحتاج إلى "إعادة الهيكلة" ، ربما هو أكثر كفاءة في قاعدة البيانات ؟

لذلك:هل ما تشعر به هو الأكثر ملاءمة لك مستقبل مشرف من التعليمات البرمجية والبيانات.:-)

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

ولكن على الإجابة-y ملاحظة ، آمنة أعتقد أن الخلية هو أسرع, نظرا جيدة فهارس جيدة هيكل قاعدة البيانات/تطبيع و لا يتوهم جدا/الاستعلامات المعقدة.عمليات الإدخال/الإخراج دائما مكلفة (قراءة:بطيئة) ، في حين ، كما ذكر سابقا ، فإن مجموعة البيانات بأكملها بالفعل المخزنة في الذاكرة من قبل الخلية.

بالإضافة إلى أنني تخيل أنك فكرت في القيام بمزيد من سلسلة التلاعب مع تلك الملفات المضمنة ، الأمر الذي يجعل الأمور أكثر مزعجة - أنا مقتنع الخلية سلسلة البحث خوارزميات أفضل بكثير الأمثل مما كنت يمكن أن تأتي مع في بي.

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

تشمل بالتأكيد طالما أن الملف ليس كبير جدا و كنت في نهاية المطاف استخدام الكثير من الذاكرة في هذه الحالة قاعدة البيانات يكون من المستحسن

قراءة في البيانات الخام إلى النص من ملف سوف تكون عادة أسرع من قاعدة البيانات.

ومع ذلك فإنه يبدو وكأنه كنت ترغب في الاستعلام عن البيانات من أجل العثور على تطابق للعودة إلى جافا سكريبت.قد تجد في هذه الحالة أن الخلية سوف تكون أسرع الفعلية الاستعلام/البحث عن البيانات (خاصة إذا فهرستها بشكل صحيح.... الخ) لأن هذا شيء قاعدة بيانات جيدة.

قراءة في ملف كبير هو أيضا أقل قابلة للتطوير كما سوف تستخدم الكثير من ذاكرة الخادم بينما السيناريو ينفذ.

لماذا لا تفعل ذلك في كلا الاتجاهين والتي ترى هو أسرع ؟ كل الحلول تافهة جدا.

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

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

كان هناك عدد قليل من العوامل المختلفة التي جعلت الملف أسرع من الخلية بالنسبة لي:

  1. حجم الملف صغير-تحت 100kb من البيانات النصية
  2. لقد كان عشوائيا اختيار وليس البحث -- فهارس لا يوجد اختلاف
  3. وقت الاتصال -- فتح الملف وقراءته في كان أسرع من الاتصال إلى قاعدة البيانات عند تحميل الملقم عالية.هذا صحيح خاصة وأن نظام التشغيل مؤقتا الملف في الذاكرة

خلاصة القول أنني قياس و مقارنة النتائج.من أجل العمل, ملف النظام كان أسرع.وأظن لو مجموعة البيانات من أي وقت مضى ينمو ، من شأنها أن تغير.أنا ذاهب إلى إبقاء العين على الأداء و أنا مستعد تغيير الطريقة التي يعمل بها في المستقبل.

إذا كنت تستخدم PHP بايت كود ذاكرة التخزين المؤقت مثل APC أو Xcache ، بما في ذلك الملف من المرجح أن يكون أسرع.إذا كنت تستخدم PHP وتريد أداء بايت كود ذاكرة التخزين المؤقت على الاطلاق شرط.

يبدو أنك تفكر في الحفاظ على بيانات ثابتة حولها في السيناريو PHP التي تشمل لتجنب ضرب قاعدة البيانات.أنت أساسا القيام بدائية ذاكرة التخزين المؤقت.هذا يمكن أن تعمل على ما يرام طالما لديك طريقة لتحديث هذا الملف إذا/عندما تكون البيانات لا تغيير.قد تبدو أيضا يريدون معرفة المزيد عن الخلية ذاكرة التخزين المؤقت الاستعلام لجعل استعلامات SQL ضد ساكنة البيانات بشكل أسرع.أو أعطها لحفظ بيانات ثابتة في الذاكرة.

أنا بالضبط لا أعرف, ولكن في opinio باستخدام الخلية ، حتى لو كان يمكن أن يكون أبطأ ، sould أن تستخدم إذا كان المحتوى الديناميكي.ولكن أنا متأكد من أنه هو أسرع كبيرة محتويات باستخدام تشمل.

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