数据库锁
数据库锁分为乐观锁和悲观锁
乐观锁:提交的所做的修改数据库时才会加锁,完成修改才会释放锁
悲观锁:从数据开始更改时就将数据锁住,知道更改完成才释放
悲观锁又分为表锁、行锁、页锁
表锁和行锁都分为共享锁和排他锁,而更新锁是为了解决行锁升级
innodb 中表锁和行锁一起用,所以为了提高效率才会有意向锁
分区分表
-
什么是mysql分表和分区
分表就是把一张表分成多个小表
分区就是把一个表分成多个区块,可以在同一磁盘,也可以在不同磁盘 -
Mysql分表和分区有什么区别?
1) 实现方式
(a) 分表是一张表分成多个小表,每个小表都是一张表,都对应三个文件 :
.MYD:数据文件
.MYI:索引文件
.frm:表结构文件
(b) 分区是一张表分为多个区块,存的数据区块变多,但还是一张表
2) 数据处理
(a) 分表后,数据都是存放在分表里,总表只是一个外壳,存取数据发生在一个一个 的分表里面
(b) 分区不存在分表,分区只不过把存放数据的文件分成了许多小块,数据处理还是由自己来完成
3) 提高性能上
分表后,单表的并发能力提高了
Mysql分表的三种方式:
(a) 做 mysql 集群
(b) 预先估计会出现大数据量并且访问频繁的表,将其分为若干个表
(c) 利用 merge 存储引擎来实现分表
(3) 分区类型
range 分区:基于一个给定的连续区间范围,把数据分配到不同的区
list 分区:类似于 range 分区,区别在于 list 分区是居于枚举出的值列表分区,range 是基于给定的连续区间范围分区
hash 分区:基于给定的分区个数,把数据分配到不同的分区
key 分区:类似于 hash 分区 -
应该使用哪一种方式来实施数据库分库分表,这要看数据库中数据量的瓶颈 所在,并综合项目的业务类型进行考虑。
如果数据库是因为表太多而造成海量数据,并且项目的各项业务逻辑划分清晰、低耦合,那么规则简单明了、容易实施的垂直切分必是首选,而如果数据库中的表并不多,但单表的数据量很大、或数据热度很高,应该选择水平切分
mysql 读写分离
在实际的应用中,绝大部分情况都是读远大于写。Mysql 提供了读写分离的机制,所有的写操作都必须对应到 Master,读操作可以在 Master 和 Slave 机 器上进行, Slave 与 Master 的结构完全一样,一个 Master 可以有多个 Slave,甚 至 Slave 下还可以挂 Slave,通 过此方式可以有效的提高 DB 集群,所有的写操作都是先在 Master 上操 作,然后同步更新到 Slave 上,所以 从 Master 同步到 Slave 机器有一定的延迟,当系统 很繁忙的时候,延迟问题会 更加严重,Slave 机器数量的增加也会使这个问题更加严重
mysql SQL的语句优化
a) 对查询进行优化,应尽量避免全表扫描,首先考虑在where及order by涉及的裂伤建立索引
b) 应尽量避免where字句中使用!=或《》操作,否则将引擎放弃使用索引二进行全表扫描
c) 颖避免在where字句中对字段进行null值判断
d) 应尽量避免在where字句中使用or来连接条件
e) In和not in也要慎用,否则会导致全表扫描
f) 在where字句中使用参数会导致全表扫描。因为SQL只在运行时会解析局部变量
g) 应尽量避免在where字句中读字段进行表达式操作
h) 应尽量避免在where字句中对字段进行函数操作
i) 不要再where字句中的=左边进行函数和运算
j) 使用索引字段作为条件时,日过该索引是复合索引
k) 不要写一些没有意义的查询