Solr によってインデックス付けされた MySQL データベースがあります。Solr (高速) を使用して検索を実行し、JPA を使用してデータベースから Solr 検索のすべての結果を取得します。JPA は非常WHERE IN
に遅いデータベースでクエリを実行します。
このプロセスを高速化する方法や、パフォーマンスを向上させるために設計をリファクタリングする方法はありますか?
MySQL の全文検索から Solr を使用するようにアプリケーション全体をリファクタリングしたところ、パフォーマンスが低下しました。
注: 計算を実行するにはすべての結果がすぐに必要なため、ページネーションを使用できません。
Java コード:
SolrDocumentList documentList = response.getResults();
Collection<String> listingIds = new ArrayList<>();
for(SolrDocument doc : documentList) {
String listingId = (String) doc.getFirstValue("ListingId");
listingIds.add(listingId);
}
Query query = em.createNamedQuery("getAllListingsWithId");
query.setParameter("listingIds", listingIds);
List<ListedItemDetail> listings = query.getResultList();
名前付きクエリ:
<query>Select listing from ListingSet listing where listing.listingId in :listingIds</query>
追加情報:
SHOW CREATE TABLE ListingSet
[短縮]:
CREATE TABLE `listingset` (
`LISTINGID` int(11) NOT NULL,
`STARTDATE` datetime DEFAULT NULL,
`STARTPRICE` decimal(10,2) DEFAULT NULL,
`TITLE` varchar(255) DEFAULT NULL,
PRIMARY KEY (`LISTINGID`),
KEY `FK_LISTINGSET_MEMBER_MEMBERID` (`MEMBER_MEMBERID`),
CONSTRAINT `FK_LISTINGSET_MEMBER_MEMBERID` FOREIGN KEY (`MEMBER_MEMBERID`) REFERENCES `member` (`MEMBERID`),
) ENGINE=InnoDB DEFAULT CHARSET=latin1
生成された SQL の調査
生成された SQL を見ると、JPA は単一の JPA クエリに対して多くの SQL クエリを実行します。ListingSet テーブルには、リンクされている 7 つのテーブルがあり、各リスト ID (そのうち 1,000 から 10,000 まで) に対してテーブルごとに個別の SELECT クエリを実行します。したがって、私の 1 つの JPA クエリは、約 7,000 クエリのように見えます!