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个表相关联,并且为每个listingid(共有1,000-10,000个)运行单独的SELECT查询。因此,我的一个JPA查询被分解成了大约7,000个查询!
<query>..</query>
中的查询不是原始 SQL 查询,而是由 JPA 转换成您建议的形式。 - KevinListingSet (listingId)
上有索引吗(显示SHOW CREATE TABLE ListingSet;
的输出)?能提供执行计划吗?(在Workbench或命令行中运行EXPLAIN SELECT ...
并将输出粘贴到问题中)。 - ypercubeᵀᴹ