mysql

原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
一致性(Consistency)
事务前后数据的完整性必须保持一致。
隔离性(Isolation)
事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
持久性(Durability)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响
 

explain: extra:

 use where:引擎层没有过滤完,server 也进行了顾虑

using firesort  : 没用到索引排序

using temporay:用到了临时表 例如  group by,UNION

   过滤包括2方面:1、引擎层 2、server层

    1、索引下推

innodb

锁类型

  共享锁(行)/读锁、排他锁(行)/写锁、意向共享锁(表)、意向排他锁(表)、自增锁行锁的算法

1、记录锁:主键锁

2、间隙锁(例如 update test set i = 1 where num = 10,没有10这条记录,表里面 只有8,12这俩条记录,则会把(8,12】的区域加排他锁)、用于阻塞插入

3、临建锁(假如范围更新时,会把相邻的范围锁住,例如 update test set i = 1 where num > 10,会把(10,+∞】的区域加排他锁),假如数据num最大是8,num起始值仍然是10

临建锁 = 间隙锁 + 记录锁 左开右闭,(1,20},解决的就是幻读,针对范围查询

 

四种隔离级别:

read-uncommited,read-commit,read-repetable,read-serial

3种错误:脏读、不可重复读、幻读

行锁 锁的是索引,因为表必有索引,表必会被锁住,假如只有默认索引,将会锁表

    所以我们更新操作的时候,必须有索引的过滤条件,否则将会锁表

     任何更新操作都会加排它锁,和java的锁是一样的处理方式

     innodb的行锁需要的时候才加上,并不是锁不用了就删除,而是要等事务结束,才会释放

     假如事务要锁多个行,尽量把最可能影响冲突,并发布高的sql放在事务最后面。

 

mvcc:多版本控制 :每个事物查询,都是查询的快照,后续的事物修改不会影响当前的事物的查询数据

      每一行俩个隐藏列:当前事务ID,删除事务ID

 


mysql> CREATE TABLE `t` (
  `id` int(11) NOT NULL,
  `k` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;
insert into t(id, k) values(1,1),(2,2);

一致性读、当前读和行锁 串起来

一致性读:事物A没有更新操作,全是select,mvcc 其数据是 K=1

当前读:事物B的update操作,会先select 当前读,先获得C事物已提交的更改,再更新这条数据.

行锁:假如C在B后面提交,那么B的操作就会等待,因为C持有id=1的锁

 

 

redo(crash failue)、binlog(备份)、undo(保证原子性、快照读)

事务开始后,每一次CRD操作后,2阶段提交:最新数据立马插入redo 为prepare,然后生成binlog,然后redo直接commit,

上一版本数据插入到undo。

大查询会不会把内存耗光

 1、mysql是边算边发,个人感觉类似TCP的滑动窗口,不会保留所有数据

 2、有一个缓存:buffer_pool,select语句会先查询buffer_pool,假如没有再去查硬盘,buffer_pool类似于LRU机制,和JVM一样分为俩部分:young(热数据)、old(冷数据),因为缓存有限,假如大表会覆盖buffer_pool,一次select假如young存在,则放在head,正常的LRU机制,假如不存在,放到old区域,下次查询,超过1秒还存在,则放到young,否则还在old,另:young:old == 5:3

关于buffer_pool和changeBuffer:

    事务性操作,changeBuffer占用的是buffer_pool的空间

    针对普通索引:假如数据在内存里,直接更新,不在内存里,更新操作放到changeBuffer(可持久化)

    针对唯一索引:要去磁盘校验唯一性无法应用changeBuffer

   将数据从磁盘写入内存,是随机读IO,成本最高,changeBuffer改善了这个性能

  但假如:更新后,立马查询,这个时候会merge数据,影响效率

redo : 事务性操作,针对随机写转为 顺序写,写到redo文件上

 

为什么建表规范里:一定要有自增主键

  因为B+数,

  会涉及到移动数据、分页

   假如 插入700,可直接在R5后面加,插入400,需要移动数据,更严重的是,假如R5页满了,还要分裂新页。性能、控件利用率都受影响。所以业务逻辑做主键,无法保证有序插入。

数据库的delete 删除操作,不会清空间,只会标记当前page可复用。全部删除数据,所有空间即可复用,但不代表占用空间会降低。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值