mysql相关问题总结

MySQL相关问题
一.mysql的acid
mysql 默认的隔离级别是可重复读(repeatable_read),oracle默认的数据库隔离级别是读已提交(read_committed)
原子性
一个事务中的操作,要么都成功,要么都失败.
一致性
事务执行前和执行后,来源和去向保持一致.
隔离性
并法时每个事务都是隔离的相互不影响.隔离的粒度由隔离级别决定.
持久性
一旦事务提交成功,应该保证数据的完整性存在.
2.隔离级别
隔离级别有:读未提交,读已提交,可重复读,串行化四种.
隔离级别解决的问题:脏读.不可重复读,幻读.
脏读:一个事务读取到了另一个事务未提交的数据.
不可重复读:一个事务开始只能看见已经提交的事务,导致俩次相同的查询,得到的结果有可能不一样.
幻读:当一个事务在执行update操作将1改成2的时候,这个时候另外一个事务插入了一条=1的数据,再查看刚才修改的数据的发现还有一条数据没有修改,其实这个是另外一个事务新添加的,就好像产生幻觉一样,这就是幻读.
2.1READ_uncommitted(读未提交)
在事务中的修改还没有提交就被另一个事务读取了,
2.2READ_COMMITED(读已提交)
在一个事务中只能读取到另一个事务已经提交的数据.
2.3REPEATABLE_RED(可重复读)
在同一个事务中多次读取到的记录结果是一致的,mysql是通过mvcc来实现的(多版本控制)
2.4SERIALIZABLE(可串行化)
serializable是最高的隔离级别,他通过强制事务串行执行,避免了幻读的问题.

二…MySQL数据库的存储引擎
mysql常用的执行引擎有InnoDB,MyIsam,MEMORY
1.InnoDB
是数据库默认的存储引擎,支持事务,支持行锁和外键.主要的特点是:
1.1.支持外键完整性约束,存储表中的数据时,每张表的存储都按主键的顺序存放,如果没有显示在表中指定主键,InnoDB会为每一行数据生成一个6字节的ROEID,并以此作为主键.
1.2…frm表的定义文件,.idb数据文件
1.3.count函数扫表
1.4 InnDB的行锁事实现在索引上的,而不是锁在物理行记录上,也就是说没有命中索引,就无法使用行锁,退化成表锁.
2.mylsam
2.1 不支持外键,不支持事务
2.2 .frm表的定义文件,.myd数据文件,.myi索引文件
2.3 count 如果不加where条件直接读取存储的值
2.4 查询效率一般情况下比InnoDB效率要高,因为InnoDB涉及到回表操作
三.sql优化
1.为什么不建议在重复数据较多的字段上加索引?
因为在查询时,非唯一主键索引存的是当前列的值和唯一索引的指向.如果用重复数据较多的字段做查询条件时,获取的数据不是该列所包含的,就要尽行回表获取.导致查询效率变低,还增加了维护索引的成本.
2.什么时候索引会失效?
1.使用 or like % ,对字段进行函数操作,null值判断 都会使索引失效.
2.联合索引遵循最左原理,例如(a,b,c) a|ab|abc都会起作用,而bc不走索引.

三.mysql的事务
1.mysql中存在redo.log负责对数据库的修改,undo.log负责对数据的回滚
2.事务的一个大概执行流程
1.将数据库数据拷贝到undo.log执行修改删除,添加操作后写入redo日志,

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值