1

私は現在、events挿入 (および更新) が多い (1 分あたり 1,000 ~ 5,000 回の挿入を予測している) テーブルを持つデータベースを設計していますが、日付で並べ替える必要もあります。

各イベントにはreadブール フィールド があり、 (datetime)で並べuser_id替えられます。selectステートメントは次のようになりますupdated_atDESC

SELECT * FROM `events` WHERE `read`=0 AND `user_id`='<user id>' ORDER BY `updated_at` DESC

現在、readuser_id、および でインデックスを使用しupdated_atてフェッチとソートを最適化することを考えていますが、これはインデックス全体が で更新されることを意味しますか?

UPDATE `events` SET `read`='1' WHERE `id`='<event id>'

?

この状況で最もパフォーマンス効率の高い (挿入、更新、選択) ソリューションは何でしょうか?

4

1 に答える 1

2

MySQLは、クエリごとにテーブルごとに1つのインデックスのみを使用するため(インデックスのマージが発生したときに複数のインデックスを使用する場合があります)、複数のインデックスを作成してもクエリは高速化されません。

私が正しく思い出せば、インデックスで最初に最も判別式のセレクターを使用する方が良いので、user_id.read.updated_atおそらく良い解決策になるでしょう。

インデックスの更新に非常にコストがかかるかどうかはわかりませんが、MySQLインデックスはデフォルトでツリーであるreadため、変更するとエンジンはuser_idリーフの下で動作するだけなので、影響は少なくなる可能性があります。

それでも、インデックスをオンにuser_id.updated_atしてMySQLフィルターをそのままにしておくことができますread。ほとんどの場合、テーブルからのデータの順序付けは、フィルター処理よりもコストがかかります。

于 2012-10-07T09:32:26.277 に答える