Java 多表嵌套选择的性能
我使用多个表中的多个嵌套选择进行查询,如下所示:Java 多表嵌套选择的性能,java,mysql,sql,performance,jpa,Java,Mysql,Sql,Performance,Jpa,我使用多个表中的多个嵌套选择进行查询,如下所示: select c.name,c.created_date, ( select count(id) from user u where u.company_id=c.id ) as users, ( select count(distinct uls.user_id) from user_login_status uls where uls.company_id=c.id and uls.date between '
select c.name,c.created_date,
( select count(id) from user u
where u.company_id=c.id ) as users,
( select count(distinct uls.user_id) from user_login_status uls
where uls.company_id=c.id
and uls.date between '2013-11-18' and '2014-01-10' ) as unique_logins,
( select count(id) from cash_receiving cr
where cr.company_id=c.id
and cr.created_date between '2013-11-18' and '2014-01-10' ) as recognitions,
0 as licences,
( select count(id) from inventory_item i
where i.company_gid=c.id ) as store_items,
( select count(id) from award a
where a.company_gid=c.id ) as awards,
( select uls2.date from user_login_status uls2
where uls2.company_id=c.id
ORDER BY uls2.date DESC LIMIT 1 ) as last_login,
c.id as id,
c.is_live as live
from company c
order by c.name
user_login_status包含每个用户登录的条目,因此它将有大量数据,即sql端,至于我使用entity manager调用上述查询的java端
所以我想知道上面的查询的性能,它是否能很好地处理每个表的大量数据,或者最好使用单独的select语句,请建议如何使上面的查询运行良好,谢谢。尝试以下方法:
SELECT c.name,c.created_date, u.users, uls.unique_logins, cr.recognitions,
0 AS licences, i.store_items, s.awards, uls2.last_login,
c.id AS id, c.is_live AS live
FROM company c
LEFT JOIN (SELECT u.company_id, COUNT(u.id) users
FROM user u
GROUP BY u.company_id
) AS u ON u.company_id = c.id
LEFT JOIN (SELECT uls.company_id, COUNT(DISTINCT uls.user_id) unique_logins
FROM user_login_status uls WHERE uls.date BETWEEN '2013-11-18' AND '2014-01-10'
GROUP BY uls.company_id
) AS uls ON uls.company_id=c.id
LEFT JOIN (SELECT cr.company_id, COUNT(cr.id) recognitions FROM cash_receiving cr
WHERE cr.created_date BETWEEN '2013-11-18' AND '2014-01-10'
GROUP BY cr.company_id
) AS cr ON cr.company_id = c.id
LEFT JOIN (SELECT i.company_gid, COUNT(i.id) store_items
FROM inventory_item i
GROUP BY i.company_gid
) AS i ON i.company_gid = c.id
LEFT JOIN (SELECT a.company_gid, COUNT(a.id) awards
FROM award a
GROUP BY a.company_gid
) AS a ON a.company_gid = c.id
LEFT JOIN (SELECT uls2.company_id, MAX(uls2.date) last_login
FROM user_login_status uls2
GROUP BY uls2.company_id
) AS uls2 ON uls2.company_id=c.id
ORDER BY c.name
您是否无法测试性能?你在这里能得到的只是猜测和随机复述战争故事。@Marko Topolnik,我的数据库中还没有海量数据,所以我想问的是,这是否会导致未来性能不佳?通过插入海量数据来测试,没有其他方法可以知道。