从零开始java数据库SQL优化(二):多个LEFT JOIN的SQL优化

本文详细介绍了如何优化包含多个LEFT JOIN的SQL查询,包括对用户表、用户角色表、角色菜单表和用户部门表的索引优化,遵循阿里Java开发手册的建议,并探讨了LEFT JOIN的查询原理和优化策略。此外,还讨论了预编译SQL的视图方式,阐述了视图的创建、使用场景及其与存储过程的区别。
摘要由CSDN通过智能技术生成

一:场景

  我代码里需要在用户登录时将所有用户相关的用户,角色,部门,岗位,权限(其中权限放在菜单中,每2张表有一张关联表),不多说直接上SQL

SELECT 
			a.fk_user_id AS "fk_user_id",
			a.user_realname AS "user_realname",
			a.user_name AS "user_name",
			a.user_type AS "user_type",
			a.sex AS "sex",
			a.phone AS "phone",
			a.password AS "password",
			a.user_addr AS "user_addr",
			a.avater AS "avater",
			a.status AS "status",
			
			
			
			fr.role_id as role_id,
			fr.role_code as role_code,
			fr.role_name as role_name,
			fr.role_range as role_range,
			
			
			fd.dept_id as dept_id,
			fd.dept_name as dept_name,
			fd.parent_id     as dept_parent,
			fd.parent_ids     as dept_parents,
			fd.company_name as company_name, 
			 
			fp.post_id as post_id,
			fp.post_name as post_name,
			fp.post_split as post_split,
			
			m.perms as perms
			
			FROM fk_user a
		 	LEFT JOIN fk_user_role fkur ON fkur.user_id = a.fk_user_id
			LEFT JOIN fk_role fr ON fr.role_id = fkur.role_id
			LEFT JOIN fk_role_menu rm ON rm.role_id = fr.role_id
			LEFT JOIN fk_menu m ON m.menu_id = rm.menu_id
	
			LEFT JOIN fk_dept fd ON fd.dept_id = a.dept_id
			LEFT JOIN fk_user_post fup ON fup.user_id = a.fk_user_id
			LEFT JOIN fk_post fp ON fp.post_id = fup.post_id 
WHERE a.user_name ='admin'

耗时:

二:优化索引

 1. 用户表优化

回答: 当需要进行多个left join操作时,可以考虑以下优化方法。首先,可以尝试使用子查询的方式进行left join查询,这样可以减少表的关联数量。其次,可以考虑添加索引来提高查询效率。在阿里Java开发的规范手册中,明确提到left join表的数量最多不得超过3个\[2\]。另外,还可以通过分析数据库执行计划和数据量来确定是否需要进行进一步的优化。如果数据量较大,可以考虑对left join字段添加索引,以提高查询效率\[3\]。总之,通过合理的查询方式和索引优化,可以提高多个left join操作的效率。 #### 引用[.reference_title] - *1* [记一次MySQL 多表联查时多个left join优化](https://blog.csdn.net/weixin_44096961/article/details/102821224)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [从零开始java数据库SQL优化):多个LEFT JOINSQL优化](https://blog.csdn.net/qq_35755863/article/details/102236637)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [十几个大表left join的大SQL查询优化](https://blog.csdn.net/Andrew_Chenwq/article/details/122521709)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值