sql优化方案:
1.添加索引,在条件参数,关联参数上建立参数,
2.字段优化,需要什么字段查什么字段
3.模糊查询尽量使用: select * from tableName a where a.name like 'name%'
避免使用 '%name%' 和 '%name';
3.利用explain 分析SQL
id | SELECT识别符。这是SELECT的查询序列号 |
select_type |
SELECT类型,可以为以下任何一种:
|
table |
输出的行所引用的表 |
type |
联接类型。下面给出各种联接类型,按照从最佳类型到最坏类型进行排序:
|
possible_keys |
指出MySQL能使用哪个索引在该表中找到行 |
key | 显示MySQL实际决定使用的键(索引)。如果没有选择索引,键是NULL。 |
key_len | 显示MySQL决定使用的键长度。如果键是NULL,则长度为NULL。 |
ref | 显示使用哪个列或常数与key一起从表中选择行。 |
rows | 显示MySQL认为它执行查询时必须检查的行数。多行之间的数据相乘可以估算要处理的行数。 |
filtered | 显示了通过条件过滤出的行数的百分比估计值。 |
Extra |
该列包含MySQL解决查询的详细信息
|
4.经常增删改的表建索引,也还是有问题的,解决办法是删除索引,重新建立索引!
案例:
<select id="table_list" resultType="map" parameterType="bas.model.BasVehicleOwner" fetchSize="1000" flushCache="true">
select * from ( SELECT a.*, b. NAME AS owneridtypename,db. NAME AS logicdelstatusname FROM zc_bas_vehicle_owner a LEFT JOIN sys_dict b ON a.owneridtype = b. CODE AND b.pname = 'idtype' AND b.pid != 0 LEFT JOIN sys_dict db ON a.logicdelstatus = db. CODE AND db.pid != 0 AND db.pname = 'logicdelstatus') tab where 1=1
<!-- select * from zc_bas_vehicle_owner -->
<if test="ent.id != null and ent.id != '' ">
and id = #{ent.id }
</if>
<if test="ent.ownername != null and ent.ownername != '' ">
and ownername = #{ent.ownername }
</if>
<if test="ent.ownerid != null and ent.ownerid != '' ">
and ownerid = #{ent.ownerid }
</if>
<if test="ent.weixin != null and ent.weixin != '' ">
and weixin = #{ent.weixin }
</if>
<if test="ent.logicdelstatus != null and ent.logicdelstatus != '' ">
and logicdelstatus = #{ent.logicdelstatus }
</if>
</select>
治超项目数据查询慢是多方面的:
1.SQL本身关联了多张表
关联了2次字典表
2.分页SQL:
查询两次:
2.1 查询分页数据结果集查询效率还可以
2.2 查询总记录数很慢
很慢的原因是查询了所有数据然后再coun(1)
SQL: select count(1) from + ( 上面的SQL )+条件
优化方案1:
分开单表查询,然后利用Java遍历设置字典值
List<Map<String, Object>> table_list = isBasVehicleOwnerMapper.table_list(page,ent);
List<Map<String, Object>> dictList1 = publicMapper.getDictList(null, "idtype");
List<Map<String, Object>> dictList2 = publicMapper.getDictList(null, "logicdelstatus");
for(Map<String,Object> map : table_list) {
map.put("owneridtypename", null);
map.put("logicdelstatusname", null);
for(Map<String,Object> map1: dictList1) {
if(String.valueOf(map.get("owneridtype")).equals(map1.get("code"))) {
map.put("owneridtypename", map1.get("name"));
break;
}
}
for(Map<String,Object> map2: dictList2) {
if(String.valueOf(map.get("logicdelstatus")).equals(map2.get("code"))) {
map.put("logicdelstatusname", map2.get("name"));
break;
}
}
}
优化方案2:
mybatis-plus 分页插件不查询总记录数2.18版本(注意版本各个版本方法不一致)
page.setSearchCount(false);
自定义SQL查询总记录数设置
page.setTotal(total);
方案1和方案2实际对比:
方案1只适合单表和字典表关联查询,多个表复杂查询就不好操作了
方案2查询页码比较大的数据时候就很慢了,这个方案1没有出现