InnoDB を使用してフォーラム データベースを設計していますが、質問がいくつかあります。
以下の投稿とコメントの表のデザイン
CREATE TABLE `my_posts` (
`forum_id` mediumint(8) unsigned NOT NULL,
`post_id` int(10) unsigned NOT NULL, // not an auto increment
subject varchar(200) NOT NULL,
`details` text NOT NULL,
`access` tinyint(3) unsigned NOT NULL, //private,friends,public
`created_by` int(10) unsigned NOT NULL,
`created_on` int(10) unsigned NOT NULL,
`updated_on` int(10) unsigned NOT NULL,
`comment_count` smallint(5) unsigned NOT NULL DEFAULT '0',
`ip_address` int(10) unsigned NOT NULL,
sphinx_unique_id int(10) unsigned NOT NULL, // not an auto increment
PRIMARY KEY (`forum_id`,`post_id`,created_by)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `my_posts_comments` (
`forum_id` mediumint(8) unsigned NOT NULL,
`post_id` int(10) unsigned NOT NULL, // not an auto increment
`comment_id` int(10) unsigned NOT NULL,
`details` text NOT NULL,
`created_by` int(10) unsigned NOT NULL,
`created_on` int(10) unsigned NOT NULL,
`ip_address` int(10) unsigned NOT NULL,
PRIMARY KEY (`forum_id`,`post_id`,comment_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
forum_id、post_id、created_by に基づいたクエリと、 updated_on 、comment_count の並べ替えがあります。
SELECT * FROM my_posts WHERE access=public ORDER BY updated_on DESC //OR ASC
SELECT * FROM my_posts WHERE access=public ORDER BY comment_count DESC //OR ASC
SELECT * FROM my_posts WHERE forum_id=? and access=public ORDER BY updated_on DESC //OR ASC
SELECT * FROM my_posts WHERE forum_id=? and access=public ORDER BY comment_count DESC //OR ASC
SELECT * FROM my_posts WHERE created_by=? ORDER BY updated_on DESC //OR ASC
SELECT * FROM my_posts WHERE created_by=(Friends_ids) AND access=(public,friends) ORDER BY updated_on DESC //OR ASC
SELECT * FROM my_posts WHERE forum_id=? AND post_id=?
SELECT * FROM my_posts_comments WHERE forum_id=? AND post_id=?
1) forum_id、post_id、created_byの複合主キーであるため、 created_byで調整するだけでアクセスする際に問題が発生します。created_byでクエリを実行するのに最適な設計は何 ですか? 複合キーからcreated_byを削除して、それにインデックスを追加することはできますか? ここでクラスターのパフォーマンスを失います..
2) フォーラム レベルで post_id をインクリメントする最良の方法は何ですか? または、テーブル レベルでインクリメントできますか。例えば
サンプルデータ (フォーラムレベル)
FORUM_ID POST_ID
1 1
1 2
1 3
1 4
2 1
2 2
2 3
2 4
2 5
またはテーブルレベル
FORUM_ID POST_ID
1 1
1 2
1 3
1 4
2 5
2 6
2 7
2 8
2 9
上記のテーブル レベルのインクリメントを使用できる場合は、sphinx 検索にのみ使用しているため、sphinx_unique_id 列を削除できます。また、コメント テーブルで、forum_id 列を削除できます。
3) updated_onとcomment_countで並べ替えているすべてのクエリ 。これらの 2 つは PK ではないため、最初の 2 つのクエリは大きな問題のように見えます..
ご協力ありがとうございます