2016-04-18 14 views
2

私は現在約1000万レコードを保持するMysqlテーブルを持っています。レコードは、継続的に別のバッチアプリケーションによって挿入され、成長を続ける。 フロントエンドでは、このテーブルのデータをさまざまな基準に基づいて検索できます。私は動的なクエリを作成し、テーブルからデータを取得するクエリDSLとJPAリポジトリを使用しています。しかし、ページネーションによるクエリのパフォーマンスは非常に遅いです。インデックス作成、InnoDB関連の調整、HikariCPとehcaheソリューションによるセッション管理を試みましたが、まだデータを取得するのに約100秒かかります。 エンティティは、他のエンティティとは関係のない単純なPOJOです。JPA - Hibernate:連続的に成長するテーブルのクエリを選択

このシナリオを実装する最善の方法/技術/フレームワークは何ですか?

答えて

1

このサイズのテーブルでは、動的クエリは実際には本当に悪い考えです。実際にはテーブルへのアクセスを制御して、テーブルスキャンを回避する必要があります。

最終的には、これはデータウェアハウスソリューションのように聞こえるのに対し、データは未処理のトランザクションデータではなくレポート形式のETLで処理されます。それでも、必要なアクセスパターンを定義し、それをサポートするためにDWHを設計する必要があります。

未加工データが最良のフォーマットであると判断した場合は、返される行数をすばやく減らすためにクエリできるサポートメタデータテーブルを定義する方法もあります。

論理的にデータをチャンクに分割する方法がある場合は、データをクラスタリングすることもできます。しかし、動的クエリと言っても、これは不可能かもしれません。

+0

私はSosnaと同意します。私はまた大きなテーブルをSchardingすることをお勧めします。これは、テーブルをN個のテーブルに分割し、同じホストまたは別のホスト上の各テーブル(schard)をホストすることです。これを手作業で行うことができます(古い学校)か、おそらく役立つ製品があります。クエリパラメータでテーブルをschardすることができれば、クエリ時間中に*どの*テーブルがクエリを実行するかを決めることができます。それ以外の場合は、すべてのテーブル(シャード)に対して同時にクエリを実行する必要があります。 – sagneta

関連する問題