1

速度低下を回避するためにデータベースを構造化する方法は?(エンジン:MyISAM)

現在、1つのテーブルに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.idPRIMARY KEY
  • member_extra.idPRIMARY KEY
  • あなたは上のインデックスを持っていますprofile_portal.pp_member_id

また、句を省略しましたORDER BYが、この句も重要です。インデックスを使用すると、句を改善することもできます。

于 2009-12-25T15:35:14.477 に答える
0

EXPLAIN PLANは、クエリエンジンがそれをどのように実行しているかを示します。「テーブルスキャン」が表示されている場合は、インデックスが必要であることがわかります。

于 2009-12-25T15:54:52.453 に答える
0

1つのテーブルの500万行はそれほど多くありませんが、クエリにはどのくらい時間がかかりますか?インデックス作成に問題があるのではないかと思います。EXPLAINステートメントは、クエリが実際に行っていることを見つけるのに役立つ場合があります。

適切にインデックス付けされたテーブルと適切なクエリがある場合は、パーティショニングを調べることができます。

編集:

テーブルibf_postsにINDEX(pid、author_id)またはINDEX(author_id、pid)を追加すると役立つかどうか試してみてください。

于 2009-12-25T16:01:59.360 に答える