JAVA随笔
随便记录点开发过程中一些项目解决思路和一些JAVA问题及思考,不定时一直更新
SQL优化(其他解决方案空间换时间)
这个JAVA的空间换时间,和时间换空间是常见的JVM性能优化方式之一,这一次主要是项目运行过程中遇到一个很棘手的问题,一个很普通的SQL,两表级联查询加一个表的条件,刚开始还好,后续数据量大了之后发现很慢,目前一张表数据150多万,另一张20多万,SQL有需要分页,还有条件分组,导致整体一个请求下来需要花费7到8秒的时间,这个时间放到前台页面响应就很恐怖了,毕竟不能让用户一直等着,然后进行了很长时间的sql优化,left join,right join有试过,优化count()
count各个性能的比较
count(primary key):遍历整个表,把主键值拿出来,累加;
count(1):遍历整个表,但是不取值,累加;
count(非空字段):遍历整个表,读出这个字段,累加;
count(可以为空的字段):遍历整个表,读出这个字段,判断不为null累加;
count():遍历整个表,做了优化,不取值,累加。
count性能排序:count(*)=count(1)>=count(primary key)>count(非空字段)>count(可以为空的字段)
当然结果发现没用,然后是加索引,用explain查看sql值计划,各个列名含义
id 查询序号
select_type 查询类型
table 表名
partitions 匹配的分区
type join类型
prossible_keys 可能会选择的索引
key 实际选择的索引
key_len 索引的长度
ref 与索引作比较的列
rows 要检索的行数(估算值)
filtered 查询条件过滤的行数的百分比
Extra 额外信息
最后换了种思路,由于业务需求,我们这个查询列表实际是导入完成以后数据基本不会改动,又考虑使用物化视图或定时任务去把这个数据提前处理掉,后续想到了缓存,其实我们这个查询数据在文件导入后就可以直接进行数据处理,把分页所需要的数据存入session后redis缓存中,每次导入文件先清空缓存,再重新添加,打开页面的时候去取出这个缓存数据(判断有缓存取缓存,无缓存重新查,查询完成之后再存入缓存),由此就可以从另一个维度去解决这个SQL查询慢的问题,当然这并不是最优解,毕竟能把SQL查询效率提升上去才是最重要的,但我这个SQL也是优化很久没啥效果,迫不得已使用这种方式,具体代码和sql我就不贴了,大家可以按照我这种思路是去试一下,有问题评论区讨论
加入缓存后: