如何构建的数据库,以避免怠工?(发动机:些)

目前,我有数据库与更多5milion记录在一个表,导致缓慢的数据检索.目前,我正在寻找方式,以结构数据库,以避免这种数据库。(数据库引擎些)

表造成的问题的文章和评论具有多5mil记录中的每一个。

我有一个想法时使用的文本文件作为储存在保存记录的日期,以便每个文件中包含足够的数据,不是减缓检索和保存流程,但与数据库我不知道该怎么做:(

是否有任何方式保存的数据(约5mil的记录在每一)在数据库不要因为缓慢的检索、插入或更新数据?

"职位"的结构

    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 条款,但是这一条款也是重要的,使用索引可以提高它。

其他提示

EXPLAIN PLAN会告诉你的查询引擎是如何做的。如果你看到“表扫描”,你知道你需要索引。

在一个表5M行不算多,你的查询正在服用多久?我怀疑你可能有一些问题索引。 EXPLAIN语句可能有助于找出你的查询实际上这样做。

如果您有适当的索引表和理智的查询,你可以看看的分区。

编辑:

您可以尝试,如果添加索引(PID,AUTHOR_ID)或INDEX(AUTHOR_ID,PID)上表ibf_posts帮助。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top