第一层:处理客户端连接,安全,授权认证等
第二层:函数,存储过程,触发器,解析(此时创建内部数据结构 [解析树],),优化,缓存等
第三层:根据传入的sql进行数据的处理,此处不会对优化器处理完后的sql做解析操作(innodb除外,它需要进行外键解析)存储引擎有多种具体实现,每种方式各有所长,此处MySQL服务器通过接口API来屏蔽掉不同的存储引擎之间的差异,使得这些差异对于查询操作透明,由于这种特性所以我们在选择存储引擎的时候应该了解不同存储引擎各自的Feature。
MySQL的并发控制
读锁:也叫共享锁,多个客户可以同时对加了读锁的数据进行读取操作
写锁:也叫排他锁,添加了排他锁的数据,阻塞其他线程对其读写
锁粒度:
表级锁:开销小,并发度低
行级锁:由存储引擎实现,开销大,并发度高
事务
A:原子性,一个事务必须视为一个最小的工作单元,整个事务要嘛全部成功,要嘛全部失败回滚
C:从一个一致性状态转变到另外一个一致性状态
I:通常来说,一个事务所作的修改,在未提交之前,其他事务是不可见的,之所以说是通常来说,是因为隔离级别的存在
D:一旦事务提交,则数据持久保留在数据库中
隔离级别
读未提交:即使当前事务还未提交,其他事务也能够读取到当前事务的修改
读已提交:只能够读取到已经提交的数据
可重复读:幻读问题,当读取范围记录的时候,两次读取到的数据数目不一致
串行化:串行化事务执行
死锁
两个客户同时争夺同一把锁
应对死锁的方案:1,锁等待超时之后放弃锁请求
2,将持有最少行级排他锁的事务进行回滚(innoDB的处理方式)
配置
show variables like 'AUTOCOMMIT' //查询数据库的自动提交属性 0/OFF 表示禁用 1/on表示启用
set [session] transaction isolation level [READ COMMIT|READ UNCOMMIT|REPEATABLE READ|SERIALIZABLE] // 设置事务的隔离级别
多版本并发控制
mvcc 使行级锁的一个变种,通过保存不同时间节点的系统版本号来实现,相比较行级锁来说,由于没有加锁过程,所以在性能方面表现得更好一点。
简化版MVCC
每个数据行后增添两列用于保存版本快照(行版本号,过期时间【删除时使用】) 每开始一个事务,。系统版本号都会递增
insert
为新插入得每一行保存当前得系统版本号作为行版本号
update
插入一条数据记录,并记录当前得行版本号,将原始数据的删除版本号置为当前的系统版本号
delete
为删除的每一行添加删除版本号为当前系统版本号
select
根据以下两个条件检索每条记录
1,只会查找行版本号早于当前版本号的数据行,这样能够保证拿到的数据要嘛使事务开始之前就存在的要嘛使自身事务修改或者插入的
2,行删除版本号要嘛未定义,要嘛大于当前的系统版本号,这可以保证查询到的数据行在事务开始之前未被删除
==innoDB数据存储在表空间,采用mvcc实现高并发,实现了四个标准的隔离级别,默认级别是可重复读,通过间隙锁来防止幻读的发生。innoDB是基于聚簇索引构建,因此对主键查询有着很高的性能而对他的二级索引(非主键索引)中必须包含主键列,所以如果主键列很大的话,其他的索引也会很大,因此,如果表上的索引比较多的话,主键应该尽可能的小 ==
MYSQL 函数:
MOUTH(date):取出date中的月份
YEAR(date):
DAY(date);
MOD()模板函数,
MONTH(birth) = MONTH(DATE_ADD(CURDATE(),INTERVAL 1 MONTH));//生日日期在下个月的查询条件