java架构师之路-高性能mysql(三)

/ java / 没有评论 / 208浏览

1.优化数据访问

    1.1减少查询的行和列

     例如:1.查询数据+limit;2.避免使用select * 只查出业务所需要的数据;3.若是重复查询相同的数据请使用缓存;

    1.2避免扫描额外的记录

    理想状态:扫描的行都是我们需要查询的行,不容易实现;

    1.索引是个好东西;2.改变库表结构,生成汇总表或者缓存表(反范式);

    1.3重构查询的方式

    1.可以考虑将复杂查询变为多个简单查询,需要考量服务的IO性能,综合做出判断。某些情况下多表嵌套查询,数据库的扫描复杂度可能是以全表乘法进行计算的,拆成多次简单查询后,效果提升非常明显;

    2.子查询可以考虑用连接查询替代,有效减少扫描行;

    3.切分查询,数据量太大的时候将大查询分为小查询进行;

    4.分解关联查询:好处:让缓存更有效率;单个查询可以减少锁的竞争;对于左表多对一连接右表的查询分解,还可以减少重复查询;

2.查询执行的基础

最 糟糕的一类查询,在in里面嵌套select子查询;mysql优化后会变成 先遍历扫描film表,每扫描到一行,再去执行in里面语句,性能非常糟糕;

  

可以优化成以下方式

3.个人心得(说人话)

        1.尽量避免在sql中做复杂计算转换,sql保证越简单越好;

        2.尽量避免代码循环体内去查询数据库;考虑IO性能;

        3.对于统计类的需求,涉及多表排序等等,可以添加冗余字段或者统计表、采用定时更新;

        4.尽量避免外键约束(意味着会查询更多地表),可以在应用程序中维护关联关系;

        总之原则:让mysql做最少的计算,最少的扫描,返回最精简的结果;