MYSQL、一意のテーブル名を使用するか、ID を使用するか
-
06-07-2019 - |
質問
現在、MYSQL データベースには 26 のテーブルがあります。私の上司は、新しいクライアントができるたびにそれらの 26 のテーブルを再作成し、それらの新しいテーブルに何らかのクライアントの略語を追加することを私に求めています。たとえば、company1~system~users や company2~system~users などがあります。
むしろ、自動インクリメントする 11 桁の INT 主キーを使用して、クライアントを追跡するテーブルをデータベースに追加し、代わりに他の 26 のテーブルで参照したいと考えています。そうすれば、データベースが 4000 個のテーブルで乱雑になることはありません。顧客が 200 社あります。
彼の懸念は、私が希望する方法を採用すると、それぞれ 2000 から 5000 のレコードを持つクライアントがテーブルを共有することになるため、MYSQL がクエリを実行するのに著しく時間がかかることだということだと思います。したがって、たとえば、1,500,000 レコードを持つ system~users というテーブルから company1 に属するユーザーを検索する場合、2,000 レコードを持つ company1~system~users というテーブルからユーザーを検索するよりも遅くなります。実際、各クライアントに 26 セットのテーブルがある場合 (クライアントごとに 26 セット)、MYSQL の検索は遅くなると思います。
実際にどの方法が遅いのでしょうか?
解決
データベースとか企業ごとに作ればいいんじゃないでしょうか?さらに、クエリを作成するときに動的なテーブル名を作成する必要さえありません。それははるかに健全な解決策です。さらに、クライアント データがより分離されるため、相互依存関係がより明確になる可能性があります。
上記の方法は、アプリケーション層も分離されている場合に最適に機能し、各インスタンスに異なるデータベース ログイン資格情報のセットを提供できます。
そうでない場合は、インストールや使用しているプラットフォームなどに応じて、正常に動作する場合もあれば、扱いにくい場合もあれば、問題ない場合もあります。
会社名を追加するのはハックですが、機能させることはできると思います。
レコードにクライアント ID を含めるのも一般的なアプローチです。テーブルに適切にインデックスが付けられている限り、パフォーマンスの観点からは 150 万レコードについて必ずしも心配する必要はありません。これは大した量のレコードではありません。さらに、企業 ID 基準により、結果がかなり適切に制限されるはずです。
他のヒント
200クライアント* [任意のテーブル内の] 5,000レコードは、データベースの標準では小さいです。 ほとんどのインデックスの最初のキーとしてclient-idを追加する場合、提案するスキームは顕著なパフォーマンスの低下をもたらさないはずです。
ただし、他の理由で顧客のデータを分離しておくことは興味深いかもしれません。アプリケーションに関してこれが理にかなっている場合は、別々のデータベースで各クライアントのデータを処理することができます。
会社識別子に適切なインデックスがあれば、パフォーマンスは問題になりません。
テーブル名にidを追加する場合、代わりに別のデータベースインスタンスを作成することを検討しませんか?テーブル名を変更するには、さまざまなインスタンスを使用するのが簡単なように、追加のコーディングが必要になる場合があります(クエリでテーブル名を動的に生成するため)。
本当に正当な理由があるまで、すべての顧客のデータを同じテーブルセットに保持します。
上記から理解したことから、あなたのデータは信じられないほど小さいため、RAMに収まります。これにより、実際にはパフォーマンスチューニングが不要になるため、インデックスクラスタリングのようなことは気にしません。
動作する最も簡単なことを実行します。それらを1つのテーブルセットに保持するだけです。
すばらしい有益な提案をありがとうございました。一般的なコンセンサスから、各クライアントのテーブルセットを独自のデータベースに分離するか、クライアントが会社識別子を持つ適切なインデックスを持つ1つのテーブルセットで情報を共有できるようにする必要があります。
あなたのソリューションは最高のサウンドであり、パフォーマンスに関してはハードウェアは安価です。 4000個のテーブルまたは26個のデータベースを維持しようとすると、より多くのRAMを搭載したより良いCPUの1回のヒットよりも多くのコストがかかります。上司があなたのためにエンジニアリングを行おうとしているように聞こえますが、それは良くありません。