地区三级联动和全盘扫描索引的建立
因为项目需求需要一个地区三级联动效果
这边表的设计是省市区同在一张表 ---->表文件:链接:https://pan.baidu.com/s/1iIz_dkg6CqJAK-7cMkJ1PQ 提取码:bafp
思路分析:因为数据全在一张表里面 所以前台数据页面初始化时候后台就应该把省市区所有数据全部查出来
1、sql文件表里面所有省的parent_id 都是0 所以先传个0就可以把所有省都查出来
2、查完后就可以根据省的主键查出所有市同理可查区的(这里和递归差不多)
封装的返回实体类:
@ApiModel(description = "地区数据模型") public class FbaRegionListModel implements BaseModel { /** * 地区编码主键 */ @ApiModelProperty(value = "地区编码主键") private String regionId; /** * 父级编号 */ @ApiModelProperty(value = "父级编号") private String parentId; /** * 地区名称 */ @ApiModelProperty(value = "地区名称") private String regionName; /** * 地区编码 */ @JsonIgnore @ApiModelProperty(value = "地区编码") private String regionSn; /** * 排序 */ @JsonIgnore private Integer sortid; //市、县 数组 @JsonIgnore @ApiModelProperty(value = "下级") private List<FbaRegionListModel> children; public List<FbaRegionListModel> getChildren() { return children; } public void setChildren(List<FbaRegionListModel> children) { this.children = children; } public static long getSerialVersionUID() { return serialVersionUID; }
核心逻辑代码:
/** * @param pid 父级 id * @return */ @Override public List<FbaRegionListModel> selecProvicetByPid(String pid) { List<FbaRegionListModel> regions; //todo:这里太耗时了,第一次查出后应该加入缓存 try { //所有省份 regions = ObjectUtils.buildBatch(FbaRegionListModel.class, mapper.selectByPid(pid)); for (FbaRegionListModel region : regions) { //添加数据 if (!region.getRegionId().equals("0") && StringUtils.isNotEmpty(region.getRegionId())) { //城市 List<FbaRegionListModel> cityList = ObjectUtils.buildBatch(FbaRegionListModel.class, mapper.selectByPid(region.getRegionId())); region.setChildren(cityList); for (FbaRegionListModel fbaRegionModel : cityList) { //县 List<FbaRegionListModel> countylist = ObjectUtils.buildBatch(FbaRegionListModel.class, mapper.selectByPid(fbaRegionModel.getRegionId())); fbaRegionModel.setChildren(countylist); } } } return regions; } catch (Exception e) { logger.error("查询异常", e); } return null; } }
大功告成!!!
但是出现个问题就是每次迭代查询都会全表查询这个三级联动大概有30000条数据 耗时8秒左右 怎么办???? 优化!!!
=========================================优化===================================================================
1、把数据查一次加redis ,先判断redis有没有有直接返回没有查数据库
2、因为数据是根据主键全盘索引的太慢所以需要建立索引 -------上图
Navicat 可视化工具:
建立完测试 没建立索引 8秒左右 建立索引后 0.94ms【这里用的postman测试的】