ユーザーアカウントごとにテーブルを作成するか、MYSQLのすべてのユーザーデータ用に1つの巨大なテーブルを作成する方が良い


8

個々のユーザーがアカウントにサインアップし、基本的にテキストドキュメントをmysqlデータベースエントリに保存できるようにするWebディレクトリを作成しています。

最初は数百人のユーザーしかいないと思われますが、ある時点で10,000〜100,000人になることを期待しています。また、各ユーザーは100〜200の「ドキュメント」をアップロードできます。

ユーザー番号でインデックス付けされた1つの巨大なテーブルを作成する方が効率的ですか?理論的には20,000,000エントリに成長する可能性があります。または、先に進み、個々のドキュメントを使用して各ユーザーのテーブルを作成しますか?

データベースに数千のテーブルを置くことは健全ではないと想定していますが、これに関する具体的なデータは実際には見つかりません。

回答:


7

MySQLは、適切にインデックスが付けられていれば、20M行を簡単に処理できます。10億行を超えるテーブルがあります。

テーブルが1つある方がきれいです。user(name)ベースのアプリケーションでマジックを実行する必要はありません。ドキュメントテーブルの統計情報も簡単に作成できます。

私は間違いなく1つの大きなテーブルアプローチを採用します。テーブル(物理)サイズについて懸念がある場合は、ドキュメントテーブルのパーティション分割を検討する必要があります。http://dev.mysql.com/doc/refman/5.5/en/partitioning-types.html


返信いただきありがとうございます。そのときは必ず1つのテーブルを使用し、パーティション分割のアプローチを調べます。ただし、1つの質問として、適切にインデックスが作成されたテーブルとは正確にはどういう意味ですか?これは多くのことを参照していると聞いていますが、これはデータベーステーブルに適切に定義されたインデックスキーが必要であることを意味していると思います。しかし、最善の最適化にはそれだけではありません。
キース

適切にインデックス付けされているとは、少なくともuser_idにフィルターをかけている列、またはドキュメントテーブルで並べ替えている列とuserテーブルのユーザー名にインデックスを付けた複合インデックスがあることを意味します(おそらく部分インデックスは、カーディナリティ90-95のチェックに十分です) %で十分です)。たとえば、次のようにsqlfiddle.com/#!2/9fb15/2(ユーザ名カーディナリティの部分インデックス5と私の場合は50%)
カロリー・ナギー

わかりました。助けてくれてありがとう。もう1つの質問は、各テーブルにプライマリインデックスキーがあると仮定した場合でも、定期的に検索することがわかっている追加の列(親カテゴリなど)をインデックスとして定義することで、最適化に役立ちますか?各テーブルに主キーまたは一意のキーと2〜4個のインデックスを定義することの欠点はありますか?
キース

はい、インデックスが役立ちます。実際には、フィルタリングする列に常にインデックスが必要です。そうしないと、クエリがフルスキャン検索になります。(インデックスサイズのほかに)唯一の欠点は、挿入と更新が遅いことですが、5.1のInnoDBプラグインと5.5以降のデフォルトでは、MySQLはインデックスの作成が高速(dev.mysql.com/doc/refman/5.5/en/…)なので、そうではありません。もう大きな問題です。
カロリー・ナギー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.