我有一个由 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 个与之链接的表,并为每个表运行一个单独的 SELECT 查询以获取每个列表 ID(其中有 1,000 - 10,000 个)。所以我的一个 JPA 查询被炸成了大约 7,000 个查询!