いくつかの大規模なシステムを扱った価値があるので、会社の一般的なapsで使用するためにサーバーからのクエリを集約するカスタムの社内アプリがありました。
たとえばselect * from t1
、次のように変換されました。
select * from db1.t1
union
select * from db2.t2
等
主な問題は、サーバー間の結合に遭遇した場合、数百万以上の行のシステムでは、ネットワークにかなりの打撃を与え、クエリの処理に長い時間がかかる可能性があることです。
たとえば、ネットワーク分析を行っていて、ユーザーの属性の「リンク」を決定するためにテーブルで結合を行う必要があるとします。
次のような奇妙なクエリが発生する可能性があります(構文を許してください)。
select db1.user1.boss, db1.user1.name, db2.user.name db2.user.boss from db1 inner join on db1.user.name = db2.user.name
(たとえば、人の上司とその上司、または友人の友人などを取得します。)
連鎖タイプのクエリを実行するために適切なデータを取得したい場合、これは非常に大きなPITAになる可能性がありますが、合計、平均などの単純な統計の場合、これらの人に最適なのは、統計をテーブルに集約する夜間のクエリでした。各サーバー(例:nightlystats)。例:select countif(user.datecreated>yesterday,1,0) as dailyregistered, sumif(user.quitdate)... into (the new nightly record)
。
これにより、合計列を合計するだけのカウント、個々のサーバー値にサーバーの合計カウントを掛けてから合計合計で割るなど、毎日の統計が非常に簡単になり、ダッシュボードビューが非常にすばやく表示されます。高いレベル。
結局、多くのインデックス作成と最適化を行うことになり、一般的に使用される情報の小さなローカルテーブルを保持するなどのトリックは、クエリを高速化するのに役立ちました。
大規模なクエリの場合、db guyは完全なシステムコピーをバックアップシステムにダンプし、ネットワークに過度に影響を与えないように、それを使用して日中にローカルで処理します。
これを減らすことができるいくつかのトリックがあります。たとえば、小さなテーブル(たとえば、ユーザーのメインテーブルなど、変更されないデータなど)を共有して、それらの収集に時間を無駄にする必要がないようにします。
実際に本当に役立つもう1つのことは、単純なクエリの合計と合計を夜間のテーブルに集約することです。
最後に興味深いのは、bwの問題の回避策は、「バックオフ」タイムアウトを社内の「クエリアグリゲーター」にプログラムすることでした。遅延すると、要求するレコードが少なくなり、要求していたクエリに遅延が追加されます(レポートを作成していて、時間に敏感ではないため、これは問題なく機能しました)
自動スケーリングするSQLがいくつかあります。最近、これを実行するツール(phpではない)に関する記事を読みました。それらはクラウド仮想マシンプロバイダーに関連していると思います。
このスレッドは、いくつかのツールと考えも提供します。MySQLシャーディングアプローチ?
NoSQLがオプションである場合は、そのルートに進む前に、そこにあるすべてのdbシステムを調べることを検討してください。
ただし、探しているものによっては、NoSQLアプローチの方が拡張しやすい場合があります。