SQL索引优化,菜单列表优化
现象: 在系统中几个数据量大的列表页面,首次进入页面未增加筛选条件,导致进入的列表查询速度非常慢。 分析: 通过SQL查看,是做了count求和查询,然后根据总的记录数来做分页处理。 查询速度慢的 原因是什么? innodb引擎在统计方面和myisam是不同的,Myisam内置了一个计数器,所以在使用 select count(*) from table 的时候,直接可以从计数器中取出数据。而innodb必须全表扫描一次方能得到总的数量。
方法: 方案1:进来的页面是空白,即没有填写查询条件的情况下,列表页为空,根据用户选择的条件来筛选。 方案2:进来的页面列表页的记录数按默认值来处理,比如:默认100条,选择该方案
可以将首次进入的页面,根据时间来倒排,比如:根据今天的时间,在时间的字段上面加上索引。 比如是日志内的数据很大,可以按时间最近3小时内的数据来展示。
通过EXPLAIN来分析索引的使用情况。将需要索引关联的字段加上相应的索引。 在首次进入列表(需要兼容非首次进入的情况,根据查询Request对象的属性来判断),可以越过count查询,count查询统计很慢,可以固定查询100条,然后在前端分页的列表上面, 根据分页前端来做列表数据的分割来展示。
order by 索引列Id desc limit 100
代码语言:javascript复制//检测是否首次进入列表页面
boolean firstAccessFlag = false;
try {
Field[] reqField = queryReqVO.getClass().getDeclaredFields();
for (Field field : reqField) {
field.setAccessible(true);
if(field.get(queryReqVO) != null){
firstAccessFlag = true;
break;
}
}
}catch (Exception e) {
log.error("check queryReqVO exception:",e);
}