web-dev-qa-db-ja.com

Mysqlデータベース内のテーブルが多すぎると、パフォーマンスに影響する可能性がありますか?

1つのMysqlデータベースインスタンスに非常に多くのテーブル(たとえば200)があると、パフォーマンスが低下する可能性がありますか?

8
user25704

一般的に、多くのものを使用するとパフォーマンスが低下します。ただし、200はかなり少ない数のようです。 2,000は実際のパフォーマンスヒットであり、間違いなく20,000です。ただし、MySQLはテーブル内の非常に多数の行を処理できるため、一般に、テーブルの数は少なくする必要があります。

7
Topher Fangio

テーブルの数はそれほど重要ではありません。

  1. 実行しているクエリ-1つのクエリ内で200をすべてクエリすることはほとんどありません
  2. 特定の時点におけるシステム全体のクエリ負荷

余分なテーブルがあるということは、メモリとハードドライブの容量を意味し、それを取り戻し、他のものに使用することができます。テーブルを非正規化すると、参照整合性がなくなるため、不良データのリスクが高まることに注意してください。

4
OMG Ponies

一般的に200テーブルは問題ではありませんが、多くの事柄に依存します。

専用のMySQLサーバーと他のソフトウェアと共有するサーバー、128Mbと128Gb RAMなど)、レコードが少ない小さなテーブルとblobと数百万の行があるテーブル。

MySQLには設定と複数のエンジンがあり、それぞれ異なる方法でテーブルのパフォーマンスに影響を与えます。

MyISAMには通常、テーブルごとに.frm、.MYD、.MYIの3つのファイルがあります。

通常モードのINNODBには、すべてのデータが中央ファイルに保存された.frmがあります。

テーブルモードごとに1つのファイルのINNODBには.frm、.idbがあります。

table_open_cacheは、一度に開くことができるテーブルの数です(デフォルト64)。これは、DBをクエリしている接続の数に関連しているため、スキーマ内のテーブル数よりも大きくする必要がある場合があります。 100個の接続が3つのテーブルを結合するということは、300個のテーブルと一時テーブルがキャッシュされていることを意味します。一般に、スキーマまたは接続が複雑になるほど、数値が大きくなります。

open-files-limit私はこれを4x table_open_cacheに設定する傾向があります。これは、正確な値を計算するのに煩わされるのではなく、寛大であるべきです。

Mysqlユーザーのオペレーティングシステムのファイルハンドル制限も問題になる可能性があります(Linuxでは、デフォルトは多くの場合1024で、ulimit -nはユーザー制限を表示します)これにより、テーブルの数が少ない場合に、テーブルの数が多くなると問題が発生する可能性がありますmysqlが必要です。これは少なくともopen-files-limitと同じでなければなりません。

他のデータベースと同様に、特定のスキーマに合わせてデータベースを最適化するために調整できる数百のチューニングパラメータがあります。 MySQLは、NDBクラスタエンジンなど、必要に応じて追加のエンジンをプラグインできるため、ほとんどの場合よりもパフォーマンスが低下します。

http://dev.mysql.com/doc/refman/5.1/en/table-cache.html

それが役に立てば幸い

4
P Mulvany

すべてのテーブルのインデックスに対して、MySQLには独自のインデックスがあります。インデックスは保持して使用するためにメモリを必要とし、インデックスにはグローバルな制限があります。多くのテーブルがある場合、インデックスをすべてRAMに置くことができないため、インデックスはディスクに移動し、パフォーマンスに直接影響します。これをmy.cnfkey_buffer_size=256M:これは、RAMインデックス情報を保持するために取っておいた量です。

2
kolypto

それをできる?承知しました。ただし、その量はアプリとそのアクセスパターンに大きく依存し、myisamまたはinnodbを使用しているかどうか、innodbがfile-per-tableモードかどうか、およびinnodbログのサイズによって異なります。それ以上の詳細を入力する必要があります。

1
Jim Zajkowski

いいえ-テーブルの数がシステムのパフォーマンスのボトルネックになることはないと思います。結局のところ、これらはファイルシステム上の単なるファイルです。データベースに何百ものテーブルがあることは珍しいことではありません。

はるかに可能性が高いのは、クエリが適切に最適化されていないことです。 log-slow-querieslog-queries-not-using-indexesをオンにすることをお勧めします。遅いクエリを特定する場合は、explainオプションを使用してこれらのクエリのクエリプランを表示し、インデックスが欠落している場所を特定します。

詳細は http://dev.mysql.com/doc/refman/5.0/en/slow-query-log.html を参照してください。

1
codeinthehole