连接池

MySQL连接池、Redis连接池 连接池是创建和管理一个连接的缓冲池的技术,这些连接准备好被任何需要它们的线程使用

数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个.
每次建立数据库连接都需要发生TCP/IP握手, 并且发生I/O. 通过建立连接池增加复用性.  

相关资料

数据库连接池学习笔记

分库分表

文章整理于网上内容, 更多详细内容参考底部[相关资料]

水平分表、垂直分表、水平分库分表、垂直分库

为什么要分库分表? 需要解决什么问题?

业务量高速增长后, 之前的数据表数据读写开始不适应, 响应系统效率及用户体验. 解决I/O问题.

垂直分表

通俗讲”大表拆小表”, 拆表便于开发和维护但是改写以前的查询语句, 会额外带来一定的成本和风险. 拆分字段的操作建议在数据库设计阶段做好.

垂直分库

垂直分库在”微服务”非常普及了, 按照业务模块划分出不同的数据库, 而不是所有的表都放在同一个数据库中.

水平分表

水平分表也叫横向分表, 将表中不同的数据行按照一定规律分布到不同的数据库表中, 降低单表数量, 优化查询性能. 常见方式通过主键或时间等字段进行Hash和取模后拆分. 分表后还是在同一个数据库中还是会有I/O瓶顶.

水平分库分表

思路和水平分表一样, 不同的是分的表在不同的数据库中, 很多大型互联网公司选择的做法.

跨库Join问题

全局表: 类似”数据字典”, 每个库都保留一份.

字段冗余: 需要关联查询的字段做冗余(空间换时间), 避免join.

数据同步: ETLI工具实施

系统层组装: 详见[分库分表的几种常见形式以及可能遇到的难]

跨库事务问题

以往在代码中通过spring注解简单配置就能实现事务的, 现在则需要花很大的成本去保证一致性.

相关资料

分库分表的几种常见形式以及可能遇到的难
大众点评订单系统分库分表实践

Memcached使用记录

Memcached是一个自由开源的,高性能,分布式内存对象缓存系统。
Memcached是以LiveJournal旗下Danga Interactive公司的Brad Fitzpatric为首开发的一款软件。现在已成为mixi、hatena、Facebook、Vox、LiveJournal等众多服务中提高Web应用扩展性的重要因素。
Memcached是一种基于内存的key-value存储,用来存储小块的任意数据(字符串、对象)。这些数据可以是数据库调用、API调用或者是页面渲染的结果。
Memcached简洁而强大。它的简洁设计便于快速开发,减轻开发难度,解决了大数据量缓存的很多问题。它的API兼容大部分流行的开发语言。

继续阅读

[转]数据库外键

外键是否采用看业务应用场景,以及开发成本的,大致列下什么时候适合,什么时候不适合使用:

  1. 互联网行业应用不推荐使用外键: 用户量大,并发度高,为此数据库服务器很容易成为性能瓶颈,尤其受IO能力限制,且不能轻易地水平扩展;若是把数据一致性的控制放到事务中,也即让应用服务器承担此部分的压力,而引用服务器一般都是可以做到轻松地水平的伸缩;

2.传统行业
1>.软件应用的人数有限,换句话说是可控的;
2>.数据库服务器的数据量也一般不会超大,且活跃数据有限;

综合上述2句话描述,也即数据库服务器的性能不是问题,所以不用过多考虑性能的问题;另外,使用外键可以降低开发成本,借助数据库产品自身的触发器可以实现表与关联表之间的数据一致性和更新;
最后一点,使用外键的方式,还可以做到开发人员和数据库设计人员的分工,可以为程序员承担更多的工作量;

为何说外键有性能问题:
1.数据库需要维护外键的内部管理;
2.外键等于把数据的一致性事务实现,全部交给数据库服务器完成;
3.有了外键,当做一些涉及外键字段的增,删,更新操作之后,需要触发相关操作去检查,而不得不消耗资源;
4.外键还会因为需要请求对其他表内部加锁而容易出现死锁情况;

数据库的诸多设计,帐号,权限,约束,触发器,都是为 C/S 结构设计的,是以 C 端不可信做为假设前提的。B/S 模式安全边界前移到 web 服务层,应用与数据库之间是可信的,应用自行完成这些功能更加灵活。所以能不用就不用。

以上内容转自知乎-大家设计数据库时使用外键吗