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
//检测是否首次进入列表页面 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); }