ما هي الطريقة الجيدة لإلغاء تسوية قاعدة بيانات MySQL؟

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

  •  08-06-2019
  •  | 
  •  

سؤال

لدي قاعدة بيانات كبيرة من بيانات الطلب التي تم تسويتها والتي أصبحت بطيئة جدًا في الاستعلام عنها لإعداد التقارير.العديد من الاستعلامات التي أستخدمها في التقارير تربط بين خمسة أو ستة جداول ويتعين علي فحص عشرات أو مئات الآلاف من الأسطر.

هناك الكثير من الاستعلامات وقد تم تحسين معظمها قدر الإمكان لتقليل تحميل الخادم وزيادة السرعة.أعتقد أن الوقت قد حان للبدء في الاحتفاظ بنسخة من البيانات بتنسيق غير طبيعي.

أي أفكار حول النهج؟هل يجب أن أبدأ باثنين من أسوأ استفساراتي ثم أبدأ من هناك؟

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

المحلول

أعرف المزيد عن mssql عن mysql، لكنني لا أعتقد أن عدد الصلات أو عدد الصفوف التي تتحدث عنها يجب أن يسبب لك الكثير من المشكلات مع الفهارس الصحيحة الموجودة.هل قمت بتحليل خطة الاستعلام لمعرفة ما إذا كنت تفتقد أيًا منها؟

http://dev.mysql.com/doc/refman/5.0/en/explain.html

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

إليك موقع وجدته يتناول هذا الموضوع:

http://www.meansandends.com/mysql-data-warehouse/?link_body%2Fbody=%7Bincl%3AAggregation%7D

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

select a.name, b.address from tbla a 
join tblb b on b.fk_a_id = a.id where a.id=1

يمكنك إنشاء جدول غير طبيعي وملؤه بنفس الاستعلام تقريبًا:

create table tbl_ab (a_id, a_name, b_address); 
-- (types elided)

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

insert tbl_ab select a.id, a.name, b.address from tbla a
join tblb b on b.fk_a_id = a.id 
-- no where clause because you want everything

ثم لإصلاح تطبيقك لاستخدام الجدول الجديد غير الطبيعي، قم بتبديل النقاط للشرطات السفلية.

select a_name as name, b_address as address 
from tbl_ab where a_id = 1;

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

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

[تعديل آخر] لا تنس أن الجداول الجديدة التي تقوم بإنشائها تحتاج إلى فهرستها أيضًا!الجزء الجيد هو أنه يمكنك فهرسة المحتوى الذي تفضله ولا تقلق بشأن التنافس على قفل التحديث، نظرًا لأنه بصرف النظر عن إدراجك المجمع، فإن الجدول لن يرى سوى التحديدات.

نصائح أخرى

يدعم MySQL 5 الآراء, ، والتي قد تكون مفيدة في هذا السيناريو.يبدو أنك قد قمت بالفعل بالكثير من التحسينات، ولكن إذا لم يكن الأمر كذلك، فيمكنك استخدام MySQL يشرح بناء الجملة لمعرفة الفهارس المستخدمة بالفعل وما الذي يبطئ استفساراتك.

فيما يتعلق بتطبيع البيانات (سواء كنت تستخدم طرق العرض أو مجرد تكرار البيانات بطريقة أكثر كفاءة)، أعتقد أن البدء بأبطأ الاستعلامات والعمل في طريقك يعد أسلوبًا جيدًا يجب اتباعه.

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

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

نحن نستخدم DB2، وهناك أمر يسمى db2expln وdb2advis، الأول سيشير إلى ما إذا كان يتم استخدام عمليات فحص الجدول مقابل عمليات فحص الفهرس، والثاني سيوصي بالفهارس التي يمكنك إضافتها لتحسين الأداء.أنا متأكد من أن MySQL لديها أدوات مماثلة ...

على أي حال، إذا كان هذا شيئًا لم تفكر فيه بعد، فقد ساعدني كثيرًا ...ولكن إذا كنت قد سلكت هذا الطريق بالفعل، فأعتقد أن هذا ليس ما تبحث عنه.

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

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

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

لإعطاء إشارة إلى الأداء باستخدام الفهارس الجيدة (بما في ذلك العديد من الفهارس المركبة)، يمكنني تشغيل استعلامات تربط بين 3 جداول في قاعدة البيانات الخاصة بنا والحصول على نتائج فورية تقريبًا في معظم الحالات.للحصول على تقارير أكثر تعقيدًا، يتم تشغيل معظم الاستعلامات في أقل من 10 ثوانٍ.تحتوي هذه الجداول الثلاثة على 33 مليون و110 مليون و140 مليون صف على التوالي.لاحظ أننا قمنا بالفعل بتطبيع هذه الأمور بشكل طفيف لتسريع الاستعلام الأكثر شيوعًا في قاعدة البيانات.

المزيد من المعلومات المتعلقة بجداولك وأنواع استعلامات التقارير قد تسمح بمزيد من الاقتراحات.

بالنسبة لـ MySQL أحب هذا الحديث: شبكة العالم الحقيقي:الأداء وقابلية التوسع، إصدار MySQL.يحتوي هذا على الكثير من النصائح المختلفة للحصول على سرعة أكبر في MySQL.

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

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

لقد وجدنا أن هذا الأسلوب سهل التنفيذ لأنه لم يعطل أي شيء كان يعمل بالفعل - إنه مجرد إدراج قاعدة بيانات إضافية في نقاط معينة.

لقد كنت أتعامل مع الفهارس المركبة ورأيت بعض الفوائد الحقيقية... ربما سأقوم بإعداد بعض الاختبارات لمعرفة ما إذا كان ذلك يمكن أن ينقذني هنا.. على الأقل لفترة أطول قليلاً.

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