扩展数据库注意事项
关系型数据库扩展是一个永恒的话题, 尤其是partitioning
和一致性方面的问题. 以下结合网上大神资料,做一个大致的总结.
索引
想要快速查询, 必须建立合适的索引. 检查经常查询的sql语句, 分析sql是否使用了正确的索引十分重要. 如mysql可以临时开启general_log
一两天, 查出使用最频繁的sql, 使用explain sql
查看查询执行计划, 然后可以确定是否需要加索引.
1 | select version(); //查看版本 |
反规范化
join
是十分费时的操作, 可以使用冗余数据, 做到同样的join
查询效果.
数据库复制
数据库的复制是数据扩展性常见话题, 具体操作流程是通过change log
把主数据库的改变replay
到从数据库中, 保证从数据库有多个数据的复制. 这里主要的注意点是如何保证数据的一致性问题.
表的分区
分表分库包含两种方式: 垂直/水平分割. 垂直分割是把一张表的列分开, 成为两张表;或者是把不同表放在不同的数据库中. 这里需要注意的是垂直分割的表如果有join
需求, 那么不要做分割.
水平分割是把一个表中的不同行分入不同的表库中, 这里主要注意把相同业务逻辑的行放在一起.
事务处理
最好能把OLAP
和OLTP
频繁操作的表分为不同的库, 也就是所谓的读写分离
. 如果是OLTP
频繁的操作, 那么需要把长时间操作移到业务逻辑实现, 同时设定合适的Isolation
隔离等级.
如果使用缓存配合数据库, 那么在用户提交的时候需要验证数据的时间戳, 保证提交时读取的数据是最新的. 如果不是那么需要终止提交, 刷新缓存中数据后再重新提交.
ORM使用
ORM
可以简化持久层逻辑, 但是对于扩展性并不是很友好. 在使用ORM
的时候需要调优考虑如下问题:
- 当一个对象被引用的时候, 这个对象会被何种程度引用
- 如果一个集合被引用的时候, 需要考虑O/R映射器是否会包含整个集合数据?
- 当一个对象需要扩展使用
join
时, 需要考虑如何选择, 是选择多个single-join
查询还是单个multiple-join
查询.
- Post title:扩展数据库注意事项
- Post author:Kopei
- Create time:2018-10-03 00:00:00
- Post link:https://kopei.github.io/2018/10/02/database-2018-10-03-数据库扩展性事项/
- Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.
Comments