1

如何构建数据库以避免减速?(引擎:MyISAM)

目前,我在一个表中有超过 500 万条记录的数据库,这会导致数据检索缓慢。我目前正在寻找构建数据库的方法以避免这种数据库。(数据库引擎 MyISAM)

导致问题的表是每个具有超过 500 万条记录的帖子和评论。

在按日期保存记录时,我有一个想法,当使用文本文件作为存储时,每个文件都包含足够的数据,不会减慢检索和保存过程,但是对于数据库我不知道该怎么做:(

有什么方法可以在 MySQL 数据库中保存数据(每个大约 500 万条记录),以免导致检索、插入或更新数据缓慢?

“帖子”结构

    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
4

3 回答 3

2

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子句,但该子句也很重要,使用索引也可以改进它。

于 2009-12-25T15:35:14.477 回答
0

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

于 2009-12-25T15:54:52.453 回答
0

一张表 5M 行不算多,你的查询需要多长时间?我怀疑您可能对索引有一些问题。EXPLAIN语句可能有助于找出您的查询实际在做什么。

如果您有正确索引的表和健全的查询,您可以研究分区。.

编辑:

如果在表 ibf_posts 上添加 INDEX(pid, author_id) 或 INDEX(author_id, pid) 有帮助,您可以尝试。

于 2009-12-25T16:01:59.360 回答