قاعدة البيانات البطيئة إعادة/تحديث/إدراج مشكلة مع أكثر من سجلات 5 ملايين في كل جدول
-
21-09-2019 - |
سؤال
كيفية تنظيم قاعدة البيانات لتجنب التباطؤ؟ (المحرك: Myisam)
حاليًا لدي قاعدة بيانات مع أكثر من 5 MILION RECORD في جدول واحد يتسبب في استرداد البيانات البطيئة. أنا أبحث حاليًا عن طرق لتنظيم قاعدة البيانات لتجنب هذه الأنواع من قاعدة البيانات. (محرك قاعدة البيانات Myisam)
الجداول التي تسبب المشكلات هي المشاركات والتعليقات التي تحتوي على أكثر من 5 ملايين سجلات في كل منها.
كان لدي فكرة عند استخدام ملف نصي كتخزين عند حفظ السجلات حسب التاريخ ، بحيث يحتوي كل ملف على بيانات كافية لم يكن يبطئ عمليات استرداد وحفظ العمليات ، ولكن مع قواعد البيانات لا أعرف ماذا أفعل :(
هل هناك أي طريقة لحفظ البيانات (حوالي 5 ملايين سجلات في كل) في قاعدة بيانات MySQL لا تتسبب في بطيئة استرداد البيانات أو إدراجها أو تحديثها؟
هيكل "المشاركات"
CREATE TABLE IF NOT EXISTS `ibf_posts` (
`pid` int(10) NOT NULL auto_increment,
`append_edit` tinyint(1) default '0',
`edit_time` int(10) default NULL,
`author_id` mediumint(8) NOT NULL default '0',
`author_name` varchar(32) default NULL,
`use_sig` tinyint(1) NOT NULL default '0',
`use_emo` tinyint(1) NOT NULL default '0',
`ip_address` varchar(16) default NULL,
`post_date` int(10) default NULL,
`icon_id` smallint(3) default NULL,
`post` text,
`queued` tinyint(1) NOT NULL default '0',
`topic_id` int(10) NOT NULL default '0',
`post_title` varchar(255) default NULL,
`new_topic` tinyint(1) default '0',
`edit_name` varchar(255) default NULL,
`post_key` varchar(32) default NULL,
`post_parent` int(10) NOT NULL default '0',
`post_htmlstate` smallint(1) NOT NULL default '0',
`post_edit_reason` varchar(255) default NULL,
PRIMARY KEY (`pid`),
KEY `topic_id` (`topic_id`,`queued`,`pid`,`post_date`),
KEY `author_id` (`author_id`,`topic_id`),
KEY `post_date` (`post_date`),
KEY `ip_address` (`ip_address`),
KEY `post_key` (`post_key`),
FULLTEXT KEY `post` (`post`),
FULLTEXT KEY `post_2` (`post`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
استفسار:
SELECT p.*, pp.*,.id,m.name,m.mgroup,m.email,m.joined,m.posts, m.last_visit, m.last_activity,m.login_anonymous,m.title,m.hide_email, m.warn_level, m.warn_lastwarn, m.points, m.topics_started, m.skin,
me.msnname,me.aim_name,me.icq_number,me.signature, me.website,me.yahoo,me.location, me.avatar_location, me.avatar_type, me.avatar_size, m.members_display_name, m.custom_post_css, m.custom_right_img
m.custom_post_color
FROM posts p
LEFT JOIN members m ON (m.id=p.author_id)
LEFT JOIN profile_portal pp ON (m.id=pp.pp_member_id)
LEFT JOIN member_extra me ON (me.id=m.id)
WHERE p.pid IN(--post ids here)
ORDER BY --ordering here
المحلول
5M
ليس كثيرا.
ربما قمت بفهرسة الجدول خطأ.
يرجى نشر استفسارك وربما سنخبرك بكيفية تحسينه.
تحديث:
SELECT p.*, pp.*,.id,m.name,m.mgroup,m.email,m.joined,m.posts, m.last_visit, m.last_activity,m.login_anonymous,m.title,m.hide_email, m.warn_level, m.warn_lastwarn, m.points, m.topics_started, m.skin,
me.msnname,me.aim_name,me.icq_number,me.signature, me.website,me.yahoo,me.location, me.avatar_location, me.avatar_type, me.avatar_size, m.members_display_name, m.custom_post_css, m.custom_right_img
m.custom_post_color
FROM posts p
LEFT JOIN
members m
ON m.id = p.author_id
LEFT JOIN
profile_portal pp
ON pp.pp_member_id = m.id
LEFT JOIN
member_extra me
ON me.id = m.id
WHERE p.pid IN (--post ids here)
ORDER BY
--ordering here
تأكد من أن:
members.id
هوPRIMARY KEY
member_extra.id
هوPRIMARY KEY
- لديك فهرس على
profile_portal.pp_member_id
كما حذفت ORDER BY
بند لكن هذا البند مهم أيضًا ، يمكن أن يؤدي استخدام الفهارس إلى تحسينه أيضًا.
نصائح أخرى
شرح الخطة ستخبرك كيف يقوم محرك الاستعلام بذلك. إذا رأيت "مسح الجدول" ، فأنت تعلم أنك بحاجة إلى فهارس.
صفوف 5M في جدول واحد ليست كثيرًا ، ما هي المدة التي تستغرقها استفساراتك؟ أظن أنك قد تواجه بعض المشكلات في الفهرسة. يشرح قد يساعد البيان في معرفة ما تفعله الاستفسارات بالفعل.
إذا كنت قد قمت بفهرسة الجداول والاستعلامات العاقلة بشكل صحيح ، فيمكنك النظر في التقسيم..
يحرر:
يمكنك المحاولة إذا كانت إضافة الفهرس (PID ، Author_id) أو الفهرس (Author_id ، PID) على الجدول IBF_POSTS يساعد.