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


10

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

回答:


8

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


7
アプリケーションが「information_schema」を利用する場合、多数のテーブルが大きな違いを生む可能性があります。「information_schema」には何もキャッシュされません。いくつかの異なるORMシステムがこれを多用しています。
Zoredache 2009年


4

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

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

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


4

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

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

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

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

通常モードの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

それが役に立てば幸い


2

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


1

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


1

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.