批量执行插入操作是对数据库的优化
InnoDB是mysql下的默认存储引擎:
a) 支持ACID,简单地说就是支持事务完整性、一致性;
b) 支持行锁,以及类似ORACLE的一致性读,多用户并发;
c) 独有的聚集索引主键设计方式,可大幅提升并发读写性能
原子性:
一个事务要么全做,要么不做,主要保证机制是undo日志
undo日志记录操作的逆向操作,insert操作记录delete操作,当事务失败回滚时候则执行undo日志中的内容就可以将数据库恢复到原有状态,实现原子性
持久性:
指事务一旦提交,对于数据库的影响就是一直存在的
主要靠redo日志来实现,每个事务执行时候会刷入redo日志,当数据库下次重启时候直接读取redo日志就可以恢复数据库
隔离性:
两个事务操作互不影响
依靠锁机制(写写)与mvcc(写读)
innodb实现行锁
innodb支持行锁,通过索引实现
·未提交读(Read Uncommitted):允许脏读,也就是可能读取到其他会话中未提交事务修改的数据
·提交读(Read Committed):只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别 (不重复读)
·可重复读(Repeated Read):可重复读。在同一个事务内的查询都是事务开始时刻一致的,InnoDB默认级别。在SQL标准中,该隔离级别消除了不可重复读,但是还存在幻象读
·串行读(Serializable):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞
脏读:
一个事务在修改数据库,另一个事务在读取数据库内容,这时候会出现脏读
不可重复读:
一个事务连续两次在读取数据库,另一个事务在这时候修改了内容,导致读取的内容不一致
幻读:
事务首先查找数据库发现没有 一行,然后准备执行插入操作,结果另一个事务在这一时刻进行插入操作,第一条事务操作失败,就像出现了幻觉。
聚集索引与非聚集索引:
聚集索引直接指向存储的物理地址
非聚集索引指向一个数据库,如果需要查询其他的内容,需要进行二次查询,通过建立符合索引来解决二次查询问题
由于索引是b树或者b+树结构,因此每次增删改都会重建索引
mysql日志系统:
redo日志,undo日志,binlog日志,慢查询日志,错误日志
redo日志:是数据格式,为了防止事务未写入磁盘重做的日志,对应事务脏页写入磁盘,就撤销
undo日志:记录事务提交之前的状态,是逻辑格式的日志,用于回滚事务操作
binlog:是逻辑格式的日志,用于主从复制,每一段时间从库通过执行binlog来保持与主库相同,事务提交后记录,一次性写入磁盘。
mvcc实现:
使用版本代替锁的概念
默认隔离级别是可重复读
隔离级别实现方式:乐观锁和悲观锁。
锁机制存在的问题:如果加了锁之后,没办法取读取数据
乐观锁:mvcc的版本的概念,在每一行加入版本的概念,使用快照数据,根据事务id来进行访问控制
mvcc读取原理:
只能读取到小于当前版本号的内容信息
插入和删除操作则选择时间点之前的版本号
如果一个事务是1,2版本持续查询
另一个事务执行插入和删除操作,那么会读取仍然是事务id为1的内容
mysql优化:
1.表结构优化(选择优化类型)
scheam优化
范式与反范式
blob与text
2.索引优化
索引:
多列索引
选择合适的索引顺序
哈希索引,查找速度相当快,但是费空间,无法用于排序
mysam存储为顺序存储,只存了行号
innodb的聚簇索引就是一张表
按照顺序插入防止页分裂,比如随机数就不好
减少冗余索引
使用压缩索引,前缀索引
3.查询优化
查询不需要的数据
分解关联查询,用小查询再代码中做拼接更好
mysql通信协议是直接把所有结果推给客户端
查询过程:
首先检查缓存,如果命中了直接返回结果
sql语句进行语法解析,语义分析
mysql根据查询优化器生成执行计划(可以优化cont,min,max,转为常数表达式)
mysql复制:
过程:
1.主库把数据记录到二进制日志中,每次提交事务之前,将数据记录到二进制日志中
2.备库将主库的二进制日志复制到自己的中继日志中
3.备库启动一个异步线程,io线程,与主库建立连接,读取主库上的二进制日志,将接收到的事件记录到中继日志
4.备库回复中继日志
原理:
1.基于语句的复制
优点:更容易理解执行过程,出现问题可以很好的定位,比如类型不一样
缺点:很多情况无法正确复制,有些语句具有顺序性,需要加锁操作
2.基于行的复制
优点:可以进行所有情况的复制,锁开销小占用更少的cpu
缺点:没有记录sql语句,导致查问题不知道原因
mysql分区表:
1、减缓单机msql表压力,分散查询
原理:
1、在执行insert,update,delete,select操作都会锁住每个底层表,除去select操作,都是确定好在哪一个分区,数据执行完后再解锁,select操作确定哪一部分分区表可以排除,然后查询剩余分区表。
网友评论