数据库优化

  • 优化shema、SQL语句
  • 索引
  • 缓存
  • 主从复制,读写分离
  • 数据拆分。垂直拆分,分布式;水平拆分,选择sharding key,改变表结构做一定的冗余,SQL语句尽量带sharding key
  • 优化分页,减少加载的数据

优化分页:

  • 子查询。比如,select * from table where age > 20 limit 1000000,10 改成 select * from table where id in (select id from table where age > 20 limit 1000000,10),索引覆盖,要查询的字段都在索引中
  • 只允许逐页查询或者按照给定路线走,这样可预测。把可预测的提前查到数据放在缓存中

通过慢查询优化SQL语句,优化方向:没有命中索引,加载不需要数据,数据量太大

  • 加载额外数据,又抛弃。优化语句
  • 语句执行计划,查看使用索引的情况。修改语句或索引,尽可能命中索引
  • 数据量太大,考虑拆分

我们说下如何实现读写分离,以MySQL为例:

  1. MySQL-proxy代理
    1. 直接实现读写分离和负载均衡,不修改代码,主从用一样账号,官方不建议用
    2. 性能低,不支持事务
  2. dao
    1. mybatis通过mybatis plugin拦截SQL。inset、update、delete访问主库,查询访问丛库。plugin通过注解或分析语句选定主从库
    2. 重写DataSourceTransactionManager,将read-ONLY的事务放进读库,其余有读有写放进写库
  3. service
    1. 类内部方法通过this.xx()相互调用,aop不拦截,需特殊处理
    2. service决定数据源,支持事务  
posted @ 2020-03-21 17:56  Ivy_Xu  阅读(166)  评论(0编辑  收藏  举报