1、两表关联使用的条件字段中字段的长度是否是一致的
2、两表关联使用的条件字段中字段的编码是否是一致的
3.因索引字段太长,字段太靠后,服务器性能,联合索引没遵循最左匹配原则,mysql配置等其它原因导致优化器放弃使用索引
我发现关联条件的索引字段所在的行太靠后,在我调整到前面,又缩小长度之后索引生效了
这个mysql优化器在mysql不同版本,不同服务器上,不同查询条件 所优化后的sql语句并不相同。只有多动手试试才知道,sql优化在很多细节上只有调试过才知道好用不好用
4,没用到关联表中的字段去查询
我发现的问题就是第4个,
客户信息36万,房源客户表62万,关联了却没用到中间表的城市id去查导致没有用到索引,直接导致查询崩溃
优化之后我的分页查询是这样的,(或者直接在map中动态关联)
if("2".equals(customer.getSourceType())&&customer.getHoHouseCustomer()!=null&&StringUtils.isNotBlank(customer.getHoHouseCustomer().getHoCityCode())){
customer.setPage(page);
//用到ho的城市查询条件则关联查ho的中间关系表
page.setList(dao.findFastHoList(customer));
return page;
}else if("1".equals(customer.getSourceType())&&customer.getResHouseclient()!=null &&StringUtils.isNotBlank(customer.getResHouseclient().getField1())){
customer.setPage(page);
// //用到res的城市查询条件则关联查res的中间关系表
page.setList(dao.findFastResList(customer));
return page;
}else{
customer.setPage(page);
page.setList(dao.findFastList(customer));
return page;
}
列表所需要的房源地址信息可查出这20条数据之后再 去房源客户表中去一个一个去拿
(或者反范式直接放到客户表中)
不然为了列表的中的20条房源信息需要关联ho房源60万数据,物业房源50万数据,
而且没有房源条件筛选,优化器就可能认为没有条件筛选就是全表扫描,当然不会用索引,
就是用到了这样大的关联查询也不会快。