主键
主键是能确定一条记录的唯一标识。当一张表把某个列设为主键的时候,则该列就有主键索引。
外键
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