MySQL 表关联的算法是 Nest Loop Join,是通过驱动表的结果集作为循环基础数据,然后一条一条地通过该结果集中的数据作为过滤条件到下一个表中查询数据,然后合并结果:
a.当无order by条件时,根据实际情况,使用left/right/inner join即可,根据explain优化 ;
b.当有order by条件时,如select * from a inner join b where 1=1 and other condition order by a.col;使用explain解释语句;
a.无order by条件时,根据实际情况,使用left/right/inner join即可,根据explain优化;
b.有order by a.col条件时,所有join必须为left join,且每个join字段都创建索引,同时where条件中只能有a表的条件,即将其它表的数据关联到a中形成一张大表,再对a的全集进行过滤;
如果不能全使用left join,则需灵活使用STRAIGHT_JOIN及其它技巧,以时间排序为例:
1)数据入库按照平台时间入库,自然a的数据都按时间有序;
SELECT
c.*, r.HYPERVISOR_HOST_NAME hostname,
r.HOST_IP
FROM
trust_monitor c STRAIGHT_JOIN res_node r ON c.res_node_id = r.ID STRAIGHT_JOIN am_assets a ON r.ASSET_ID = a.ID
AND a. STATUS = 58 STRAIGHT_JOIN se_role s ON a.DEPT_FLAG = s.ROLE_ORG
AND s.ROLE_ID IN (32, 33, 36, 41)
WHERE
c. STATUS = 58
AND c.changed_type = 79
LIMIT 1,
10;
SELECT
c.*, r.HYPERVISOR_HOST_NAME hostname,
r.HOST_IP
FROM
trust_monitor c
INNER JOIN res_node r ON c.res_node_id = r.ID
INNER JOIN am_assets a ON r.ASSET_ID = a.ID
AND a. STATUS = 58
INNER JOIN se_role s ON a.DEPT_FLAG = s.ROLE_ORG
AND s.ROLE_ID IN (32, 33, 36, 41)
WHERE
c. STATUS = 58
AND c.changed_type = 79
ORDER BY
c.changed_time
LIMIT 1,
10;
两者结果一致
a.视图只是屏蔽或者高效集合多表数据的一种方法,视图与表JOIN,不会起到任何效果
如果您发现该资源为电子书等存在侵权的资源或对该资源描述不正确等,可点击“私信”按钮向作者进行反馈;如作者无回复可进行平台仲裁,我们会在第一时间进行处理!
加入交流群
请使用微信扫一扫!