数据库优化
- 优化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为例:
- MySQL-proxy代理
- 直接实现读写分离和负载均衡,不修改代码,主从用一样账号,官方不建议用
- 性能低,不支持事务
- dao
- mybatis通过mybatis plugin拦截SQL。inset、update、delete访问主库,查询访问丛库。plugin通过注解或分析语句选定主从库
- 重写DataSourceTransactionManager,将read-ONLY的事务放进读库,其余有读有写放进写库
- service
- 类内部方法通过this.xx()相互调用,aop不拦截,需特殊处理
- service决定数据源,支持事务