好久没更新博客了,最近主要工作是对sql的优化把自己的工作心得写下来;
sql优化是一个漫长和复杂的过程
1.对sql语句的本身的优化,sql分为简单的查询和复杂的查询,尽量保证所有的查询都能使用到索引(通过执行计划查看),尽量在sql少使用子查询(根据具体的业务能不使用就不使用)。
2.根据具体的业务(如果表的数据量不是非常大),可以采用预先加载的方式,比如我第一次只有查询2个字段,下次可能要查询3个字段这种情况的查询条件一样的情况下,可以采用一次把要所有的字段查询出来然后缓存,当下次查询的条件相同就不用去数据库查询,而直接从缓存中读取数据,再取出想要的字段,这种情况对并发量的大的效果非常大,能大大减少对数据库的压力,减少对数据库的查询。当然要具体的业务具体对待缓存的数据不能很大,还有查询的条件变化不会非常大否则缓存的命中率非常低,缓存的意义就不在了。
3.对复杂sql的优化 如果一些复杂的sql很慢或者group by order by 导致很慢,可以把复杂的sql语句拆分简单的sql然后分别查询,然后在程序里面去进行拼接,去用map实现group by ,自己排序等操作,当然这种情况对一次查询的数据量不能很大否则会有jvm溢出错误。
4.总之所有的sql优化都是根据具体的业务规则来实现,不同的业务会导致不同的优化方法和不同的处理方式,所以要优化只有针对具体的业务来实现;当然跟建表是否合理有关。
5.对于mysql中尽量不要使用子查询,一般我们的理解子查询是先执行子查询然后再关联外面的表,但是mysql是直接拿外面的表每一行去关联里面子查询的表每一行所以会导致非常慢;
还有在使用sql的时候要注意where条件匹配的时候参数类型一定要一致否则会使用不到索引,比如 select * from tableName where name=123 而name是varchar在数据库有索引的情况下是用不到索引的。