扩展数据库注意事项

Kopei article

关系型数据库扩展是一个永恒的话题, 尤其是partitioning和一致性方面的问题. 以下结合网上大神资料,做一个大致的总结.

索引

想要快速查询, 必须建立合适的索引. 检查经常查询的sql语句, 分析sql是否使用了正确的索引十分重要. 如mysql可以临时开启general_log一两天, 查出使用最频繁的sql, 使用explain sql查看查询执行计划, 然后可以确定是否需要加索引.

1
2
3
4
5
6
7
8
9
10
select version(); //查看版本

set global general_log=1;//开启查询日志, 需要管理员权限.

set global log_output='TABLE';//general_log支持输出到table

select * from mysql.general_log;//查询所有sql语句的使用

select * from (select argument, count(*) as number from mysql.general_log group by argument)t
order by number DESC;//降序排列使用最多的sql语句

反规范化

join是十分费时的操作, 可以使用冗余数据, 做到同样的join查询效果.

数据库复制

数据库的复制是数据扩展性常见话题, 具体操作流程是通过change log把主数据库的改变replay到从数据库中, 保证从数据库有多个数据的复制. 这里主要的注意点是如何保证数据的一致性问题.

表的分区

分表分库包含两种方式: 垂直/水平分割. 垂直分割是把一张表的列分开, 成为两张表;或者是把不同表放在不同的数据库中. 这里需要注意的是垂直分割的表如果有join需求, 那么不要做分割.
水平分割是把一个表中的不同行分入不同的表库中, 这里主要注意把相同业务逻辑的行放在一起.

事务处理

最好能把OLAPOLTP频繁操作的表分为不同的库, 也就是所谓的读写分离. 如果是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