2016-04-27 17 views
0

チャットメサジェのMySQLの最適化

CREATE TABLE IF NOT EXISTS `chat` (
    `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT, 
    `from` int(11) UNSIGNED NOT NULL, 
    `to` int(11) UNSIGNED NOT NULL, 
    `message` text NOT NULL, 
    `sent` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', 
    `recd` int(11) UNSIGNED NOT NULL DEFAULT '0', 
    `del_from_status` int(11) NOT NULL DEFAULT '0', 
    `del_to_status` int(11) NOT NULL DEFAULT '0', 
    PRIMARY KEY (`id`), 
    KEY `from` (`from`), 
    KEY `to` (`to`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 AUTO_INCREMENT=1 ; 

1)この表には、そう、お互いに話す一日中オンライン100人の女の子を想像し、そんなに大きくなることができます私のインデックスはいいですか?

2)ユーザー1がユーザー2からすべてのメッセージを削除する場合、私はupdate del_to_status=1 where from=2 and to=1を入力しますが、すべてのテーブルをスキャンして= 2から= 1までの各メッセージを検索する必要があります。 del_to_status = 0である。私は多くのメッセージを持っている場合、それは遅くなることができますか?これに対する提案はありますか?

+0

あなたは最適化を開始する必要がありますか?それは遅いですか? – binnyb

+0

@binnyb私はそれを構築しています。私はそれについていくつかの選択肢を持っていたい将来の問題を避けるために! –

答えて

2

あなたが言及しているUPDATEクエリとチャットを表示する必要があると思うSELECTの種類を考えると、あなたのインデックスは大丈夫だと思います。

ただし、このテーブルに多数の行があることが予想される場合は、テーブルサイズを最小化するようにフィールドを最適化して、パフォーマンスが向上するとそのパフォーマンスを維持できます。 sentは、TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMPになります。 recddel_from_statusおよびdel_to_statusの目的では明確ではありませんが、ブール値のみの場合は、MySQLエンジンが最新の場合はBIT(1)フィールドを使用できます。 BOOLEANフィールドではない場合。

フィールド名にfromtoを使用するのは珍しいことですが、これらは予約済みのSQLワードです。このすべての組み合わせ、ここでCREATE TABLEを示唆した代替です:

CREATE TABLE `chat` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `from_user` int(10) unsigned NOT NULL, 
    `to_user` int(10) unsigned NOT NULL, 
    `message` text NOT NULL, 
    `sent` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    `recd` tinyint(1) NOT NULL DEFAULT '0', 
    `del_from_status` tinyint(1) NOT NULL DEFAULT '0', 
    `del_to_status` tinyint(1) NOT NULL DEFAULT '0', 
    PRIMARY KEY (`id`), 
    KEY `from` (`from_user`), 
    KEY `to` (`to_user`) 
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; 

最終的な考えは - あなたがしたいことがあり、将来的にグループチャットをサポートしたい場合は、再建築家本。どのユーザーがチャット中であるかを示すchatテーブルと、chat.idに関連するメッセージコンテンツを含むchat_messageテーブルを持つことができます。グループのチャットの参加と退室をサポートするために、「since」と「until」のタイムスタンプをchatテーブルに追加することができます。