MySQL数据库

主键

主键是能确定一条记录的唯一标识。当一张表把某个列设为主键的时候,则该列就有主键索引。

外键

1. 外键用于与另一张表的关联。能确定另一张表记录的字段,用于保持数据的一致性。比如,A表中的一个字段,是B表的主键,那该字段就可以是A表的外键。添加外键的表是从表,指向的表叫主表(B表是主表,A表为从表)。

2. 外键取值规则:空值或参照的主键值。

  • 插入非空值时,如果主键表中没有这个值,则不能插入。
  • 更新时,不能改为主键表中没有的值。
  • 删除主键表记录时,你可以在建外键时选定外键记录一起级联删除还是拒绝删除。
  • 更新主键记录时,同样有级联更新和拒绝执行的选择。

3. MySQL外键设置中的的 cascade、no action、restrict、set null:

  • cascade方式:在父表上update/delete记录时,同步update/delete掉子表的匹配记录 
  • set null方式:在父表上update/delete记录时,将子表上匹配记录的列设为null(要注意子表的外键列不能为not null) 
  • no action方式:如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作  
  • restrict方式:同no action, 都是立即检查外键约束
  • set default方式:父表有变更时,子表将外键列设置成一个默认的值 但Innodb不能识别

索引

索引用于快速找出在某个列中有一特定值的行,不使用索引,MySQL必须从第一条记录开始读完整个表,直到找出相关的行,表越大,查询数据所花费的时间就越多;如果表中查询的列有一个索引,MySQL会通过一定的方法进行存储,查询时,MySQL能够快速到达一个位置去搜索数据文件,而不必查看所有数据,那么将会节省很大一部分时间。

MyISAM和InnoDB存储引擎:只支持BTREE索引, 也就是说默认使用BTREE,不能够更换。

MEMORY/HEAP存储引擎:支持HASH和BTREE索引。

关于索引:https://www.cnblogs.com/whgk/p/6179612.html

聚集索引和非聚集索引:https://www.cnblogs.com/s-b-b/p/8334593.html

存储引擎 

  • 数据库对同样的数据,有着不同的存储方式和管理方式 在mysql中,称为存储引擎。
  • 存储引擎就是存储数据,建立索引,更新查询数据等等技术的实现方式。
  • 存储引擎是基于表的,而不是基于库的。所以存储引擎也可被称为表类型。

InnoDB:支持事务处理,支持外键,支持崩溃修复能力和并发控制。如果需要对事务的完整性要求比较高(比如银行),要求实现并发控制(比如售票),那选择InnoDB有很大的优势。如果需要频繁的更新、删除操作的数据库,也可以选择InnoDB,因为支持事务的提交(commit)和回滚(rollback)。 

MyISAM:插入数据快,空间和内存使用比较低。如果表主要是用于插入新记录和读出记录,那么选择MyISAM能实现处理高效率。如果应用的完整性、并发性要求比 较低,也可以使用。

MEMORY:所有的数据都在内存中,数据的处理速度快,但是安全性不高。如果需要很快的读写速度,对数据的安全性要求较低,可以选择MEMOEY。它对表的大小有要求,不能建立太大的表。所以,这类数据库只使用在相对较小的数据库表。(MEMORY用到的很少,因为它是把数据存到内存中,如果内存出现异常就会影响数据。如果重启或者关机,所有数据都会消失。因此,基于MEMORY的表的生命周期很短,一般是一次性的。)

存储引擎:https://www.cnblogs.com/shijiaqi1066/p/3857808.html

事务

1. 事务的基本要素(ACID)

  • 原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。
  • 一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到。
  • 隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。
  • 持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。

2. 事务的并发问题

  • 脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据
  • 不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。
  • 幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。

不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表

3.  MySQL事务隔离级别

事务隔离级别脏读不可重复读幻读
读未提交(read-uncommitted)
不可重复读(read-committed)
可重复读(repeatable-read)
串行化(serializable)

 mysql默认的事务隔离级别为repeatable-read

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值