ما هي الطريقة الأكثر فعالية لترقيم صفحات موقعي عند الاستعلام باستخدام SQL؟

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

  •  09-06-2019
  •  | 
  •  

سؤال

أحاول ترقيم نتائج استعلام SQL لاستخدامها على صفحة ويب.اللغة والواجهة الخلفية لقاعدة البيانات هي PHP وSQLite.

الكود الذي أستخدمه يعمل بشيء من هذا القبيل (ترقيم الصفحات يبدأ من 0)

http://example.com/table?page=0

page = request(page)
per = 10 // results per page
offset = page * per

// take one extra record so we know if a next link is needed
resultset = query(select columns from table where conditions limit offset, per + 1)

if(page > 0) show a previous link
if(count(resultset) > per) show a next link

unset(resultset[per])

display results

هل هناك طرق أكثر فعالية للقيام بترقيم الصفحات من هذا؟

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

هل هو أكثر كفاءة لإصدار أ COUNT(*) استعلام لمعرفة عدد الصفوف الموجودة، ثم بث النتائج إلى المتصفح؟

هل هذا واحد من هؤلاء "يعتمد ذلك على حجم طاولتك، وما إذا كان count(*) يتطلب الاستعلام فحصًا كاملاً للجدول في الواجهة الخلفية لقاعدة البيانات"، نوع الأسئلة "هل تقوم ببعض ملفات التعريف بنفسك"؟

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

المحلول

أقترح إجراء العد أولاً.العد (المفتاح الأساسي) هو استعلام فعال للغاية.

نصائح أخرى

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

الاتساق بين الصفحات ليس مشكلة بالنسبة لي.شكرا لك على مساعدتك.

هناك العديد من الحالات التي يكون لدي فيها استعلام معقد إلى حد ما (ربط الجدول 9-12)، مما يؤدي إلى إرجاع عدة آلاف من الصفوف، والتي أحتاج إلى ترقيم الصفحات.من الواضح أن ترقيم الصفحات بشكل جيد، تحتاج إلى معرفة الحجم الإجمالي للنتيجة.باستخدام قواعد بيانات MySQL، يمكن أن يساعدك استخدام توجيه SQL_CALC_FOUND_ROWS في SELECT على تحقيق ذلك بسهولة، على الرغم من أن هيئة المحلفين لم تحدد ما إذا كان ذلك سيكون أكثر كفاءة بالنسبة لك للقيام به.

ومع ذلك، نظرًا لأنك تستخدم SQLite، فإنني أوصي بالالتزام بأسلوب الاستعلام 2. هنا هو موضوع موجزة جدا حول هذه المسألة.

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

لا أعتقد أنه سيكون من المفيد جدًا بالنسبة لك إجراء عملية العد (*) في البداية.

إذا كنت مستعدًا لبعض الترميز المعقد:عندما ينظر المستخدم إلى الصفحة x، استخدم السحر المشابه لـ ajax لتحميل الصفحة x+1 مسبقًا لتحسين تجربة المستخدم.

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

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