一.MySQL最常用数据库
想到mysql,就需要怎么解决数据库高并发问题。
1.使用索引
2.使用缓存
3.使用集群
4.分库分表
(1.)索引(查询)
分类:BTree索引和哈希索引
哈希索引我们比较常用,它在绝大多数使用在为单条记录查询(查询性能快),其余 就是选择BTree索引。
(2.)缓存
Redis 项目 使用:数据字典
数据类型:List Spring hash set zset
雪崩:大量数据堆积给数据库(错开缓存时间)
击穿:因为缓存没有数据就增加了数据库压力(设置一个没有用的值)
(3. )集群
反向代理负载均衡(Nginx)
IP层负载均衡
数据链路层负载均衡
(4.)分库分表
分库:优点数据库拆分比较简单,尤其适合没有跨库查询
MySQL的存储引擎
MyISMQ InnoDB
事务
关系性数据库ACID规则
1.原子性:要么完成要么不完成。
2.一致性:执行事务前后,数据保持一致。
3.隔离性:各干各的,互不干扰。
4.持久性:数据库的数据是持久的,出现了故障也不影响数据的改变。
事务的隔离级别
1.脏读:一个事务读取了另一个事事务未提交的事务
2.不可重复读:在一次事务范围内,读取同一数据产生了不同的值。
3.虚读:读取整体的数据后。因为其他事务对数据的更新,再次查询结果不同。
锁
MyISAM采用表级锁
InnoDB支持行级锁
表级锁:粒度最大 的一种锁,触发锁冲突的概率最高,并发度最低,MyISAM和 InnoDB引擎都支持表级锁。
行级锁:粒度最小 的一种锁,其加锁粒度最小,并发度高,但加锁的开销也最大,加锁慢,会出现死锁。
数据库分片的两种常见方案
客户端代理: 分片逻辑在应用端,封装在jar包中,通过修改或者封装JDBC层来实现。 当当网的 Sharding-JDBC 、阿里的TDDL是两种比较常用的实现。
中间件代理: 在应用和数据中间加了一个代理层。分片逻辑统一维护在中间件服务中。 我们现在谈的 Mycat、360的Atlas、网易的DDB等等都是这种架构的实现