总体思路
- 客户端(1):优化客户端的应用,做Sql优化,看看是否有不必要的压力给了数据库(应用优化),难度指数低,改进效果不明显
- 服务端(2):读写分离,难度指数低,改进效果不明显
- 服务端(3):看看有没有其他办法可以降低对数据库的压力,例如引入缓存、加搜索引擎等,难度指数中等,改进效果明显,10G-100GB的 数据,完全无压力
- 服务端(4):把数据库的数据和访问分到多台数据库上,分开支持,分为垂直分割和水平分割,难度指数大,改进效果明显,适合TB级的数据量
方法3
- 加入缓存或者搜索引擎
- 缓存和队列:缓存是降低数据库读取量的出色技术。有许多应用使用这种技术可以降低数据库读负载高达80-95%。与之相对的是队列,它是用来优化写操作的。通过合并多次写操作,提高了对数据库操作的效率。大部分大型应用都应该重点考虑这两种技术。Memcached和Redis是MySQL领域非常流行的两种缓存技术。对于队列,最流行的技术是ActiveMQ和RabbitMQ,以及较新的kafka
- 外部支持技术:MySQL在很多方面都很出色,但也不是所有方面都强。如果你需要高性能全文检索,应该考虑ElasticSearch、Sphinx或者Lucene。如果你想做大规模数据分析,可以考虑基于Hadoop的基础架构或者Vertica也是不错的选择。你应该让MySQL处理它擅长的事,把其它事留给外部支持工具来做
方法4
- 垂直分割和水平分割
- 垂直分割:把一个数据库中不同业务单元的数据分到不同的数据库里面
- 水平分割:根据一定的规则把同一业务单元的数据拆分到多个数据库中
- 垂直分割和水平分割的理解
- 分片不是万能药,使用分片的场景
- 对垂直分割和水平分割都有的影响:
- 单机的ACID保证被打破了
- Join操作被影响
- 依靠外键去进行约束的场景会有影响
- 另外对于水平分割的影响:
- 依靠单库的自增序列生成唯一ID 会受影响
- 针对单个逻辑意义上的表的查询要跨库