各テーブルに 500 万件を超えるレコードがある場合、データベースの取得/更新/挿入が遅いという問題が発生する
-
21-09-2019 - |
質問
速度低下を避けるためにデータベースを構造化するにはどうすればよいですか?(エンジン: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
解決
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
条項がこの条項は重要なものは、指数が改善してしまう可能性があります。
他のヒント
PLANは、クエリエンジンがそれをやっているかを教えてくれますEXPLAIN。あなたは、「テーブルスキャン」を参照してください場合は、あなたがインデックスを必要と知っています。
1 つのテーブルに 500 万行というのはそれほど多くはありませんが、クエリにはどのくらい時間がかかりますか?インデックス作成に問題があるのではないかと思います。 説明する ステートメントは、クエリが実際に何を行っているかを調べるのに役立つ場合があります。
適切にインデックス付けされたテーブルと正常なクエリがある場合は、次のことを調べてください。 パーティション分割。.
編集:
テーブル ibf_posts に INDEX(pid, author_id) または INDEX(author_id, pid) を追加すると役立つかどうか試してみてください。