由于SQL语句写错的问题,导致生产上出现问题。
代码如下:
public List<classA> findByA(String a){
StringBuffer sql = new StringBuffer();
sql.append("SELECT * ")
.append("FROM abc ")
.append("WHERE status = :valid ")
.append("AND active_status = :active_status ")
.append("AND ada = :ada");
Query query = entityManager.createNativeQuery(sql.toString(), classA.class);
// 有效状态
query.setParameter("valid", 1);
query.setParameter("active_status", 1);
query.setParameter("A", a);
List<classA> list = query.getResultList();
if (org.springframework.util.CollectionUtils.isEmpty(list)) {
return null;
}
return list;
}
由于这里是用JPA来实现SQL语句的,而我在调用这个方法时候,传进去之前,a没有进行null判断,导致a有可能会传一个null进去,从而导致引擎放弃使用索引而进行全表扫描。
举个例子:
select id from t where num is null
所以导致每一次出现null值的情况都进行一次全表查询,而表中有好几百万条数据 _(¦3」∠)_ ,所以APP响应速度奇慢无比。之前因为在QA环境测试的时候,QA环境表中只有几百条数据,所以忽略了这个问题,对速度没感知到。
最终解决方案:在调用Dao层之前的service层对a值是否为空进行判断和控制,才终于解决这个问题。
好吧,下次要注意这种情况。而且自己需要去了解一下sql的调优,尽量杜绝这种上了生产才出现问题的情况再发生。