sql优化
select aa.id,aa.gateStationName,bb.id as gateStationId from
(select rsp.id,rsp.function_name as gateStationName
from rmc_sys_user as rsu
left join rmc_sys_user_role rsur on rsu.id = rsur.user_id
left join rmc_sys_role_permission rsrp on rsur.role_id = rsrp.role_id
left join rmc_sys_permission rsp on rsrp.permission_id = rsp.id
${ew.customSqlSegment}
and rsp.parent_id = 0 and rsp.menu_type = 2) as aa
inner join (select * from rmc_sys_permission rsp
where rsp.parent_id = 4 AND rsp.function_name LIKE '%闸%') as bb on aa.gateStationName = bb.function_name ORDER BY bb.idx
我看了下 可以优化一下
select
aa.id,
aa.gateStationName,
bb.id as gateStationId
from
(select p.id,p.function_name as gateStationName
from rmc_sys_user u
left join rmc_sys_user_role ur on u.id = ur.user_id
left join rmc_sys_role_permission rp on ur.role_id = rp.role_id
left join rmc_sys_permission p on rp.permission_id = p.id
where p.parent_id = 0 and p.menu_type = 2) as aa
join
(select * from rmc_sys_permission
where parent_id = 4 AND function_name LIKE '%闸%') as bb
on aa.gateStationName = bb.function_name
order by
bb.idx
针对Mysql的SQL优化,我有以下几点建议和看法:
不要过度依赖查询缓存,因为查询缓存的失效非常频繁,命中率很低。除非是静态表,很长时间才会更新一次,否则就不建议使用查询缓存。可以通过相关参数来查看并调整查询缓存的设置,如show global variables like 'query_cache%'。
尽量避免全表的count查询,因为它会对整个表进行扫描。可以添加索引或者针对特定条件进行优化。
利用索引覆盖来优化SQL,如全表count查询、列查询回表和分页查询等可以采用索引覆盖来提升查询性能。需要注意的是,在联合索引中,索引的最左匹配原则可以提高索引的效率。
合理设置行格式,选择合适的行格式可以避免浪费存储空间。可以根据数据类型和存储要求来选择不同的行格式,如COMPACT、DYNAMIC和REDUNDANT等。
优化查询语句,根据具体的查询情况合理设计SQL语句和索引,尽量避免全表扫描和回表操作,可以根据explain命令来查看查询计划和优化SQL语句。
定期清理无用的索引和冗余数据,避免过多的索引和重复数据影响查询性能。
监控MySQL的系统状态,及时发现和解决性能瓶颈,如连接池、CPU和内存等的占用率过高,可以通过show processlist和show status命令来查看系统状态。可以使用性能诊断工具,如pt-query-digest和mysqltuner等来帮助优化MySQL的性能。
附:示例代码
可以通过修改查询缓存相关参数来调整查询性能:
修改query_cache_type为ON,打开查询缓存
SET GLOBAL query_cache_type=ON;
修改query_cache_limit和query_cache_size为合适的大小
SET GLOBAL query_cache_limit=1024 * 1024 * 10; SET GLOBAL query_cache_size=1024 * 1024 * 100;
可以采用以下方法来优化SQL:
全表count查询优化
select count(password) from t_user;
添加索引
alter table t_user add index INDEX_PASSWORD(password);
列查询回表优化
将单列索引(username)升级为联合索引(username, sex),避免回表
分页查询优化
将单列索引(username)升级为联合索引(username, sex),避免回表
通过以下命令可以查看MySQL的系统状态:
查看当前活动进程
show processlist;
查看整体状态
show status;
使用pt-query-digest和mysqltuner等性能诊断工具来优化MySQL性能。