基本知识点
1.主键:[数据库]表中对储存数据对象予以唯一和完整标识的数据列或属性的组合。一个数据列只能有一个主键,且主键的取值不能缺失,即不能为空值(Null)
2。外键:在一个表中存在的另一个表的主键称此表的外键
数据库事务的四个特性
ACID:原子性(Atomicity)、一致性(Correspondence)、隔离性(Isolation)、持久性(Durability)
原子性(Atomicity):指的是事务中所有操作,要么全做,要么全不做。事务在执行过程中如果出现差错会全部回滚到最初的状态
一致性(Correspondence):在事务开始之前以及结束之后,数据库的完整性约束不会被破坏
隔离性(Isolation):隔离状态下执行事务,使他们好像是系统在给定时间内执行的唯一操作
持久性(Durability):在事务完成后,该事务对数据库所做的操作都会全部持久的保存在数据库中,不会被回滚
drop,delete,truncate区别
drop将删除表的结构被依赖的约束(constrain),触发器(trigger)索引(index);依赖于该表的存储过程/函数将被保留,但其状态会变为:invalid;
truncate删除表中数据,但不会删除整个表结构。对于自增字段,下次插入数据时,又是从1开始。truncate的删除整个表数据速度快,因为整个操作记录不会存储在事务日志中;
delete后面加where语句,delete每删除一行,都会在事务日志中为每删除行记录一行
对于由 FOREIGN KEY 约束引用的表,不能使用 TRUNCATE TABLE,而应使用不带 WHERE 子句的 DELETE 语句。由于 TRUNCATE TABLE 不记录在日志中,所以它不能激活触发器
数据库索引
数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询,更新数据库表中数据。索引的实现是通过B树及变种的B+树
创建索引可以大大提高系统的性能:
第一:通过创建唯一性索引,可以保证数据库中每一行数据的唯一性
第二:可以dada加快数据的检索速度
第三:使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
第四:通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能等等
应该在哪些列创建索引:经常检索查询的列;在作为主键的列上,强制该列的唯一性;在经常用在的连接列上,主要是一些外键;经常使用的where子句的列上,加速条件判断
不应该创建的索引:
第一,对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。
第二,对于那些只有很少数据值的列也不应该增加索引。这是因为,由于这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。
第三,对于那些定义为text, image和bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少。
第四,当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改性能远远大于检索性能时,不应该创建索引。
唯一索引、主键索引和聚集索引
唯一索引是不允许其中任何两行具有相同索引值的索引,一个表只能包含一个聚集索引。
MySQL中varchar与char的区别
char是一种固定长度的类型,varchar则是一种可变长度的类型
varchar(50)代表最多能放50个字符
隔离级别
读未提交(RU)
读已提交(RC):Read Committed通常是大部分数据库采用的默认隔离级别,它在Read Uncommitted隔离级别基础上所做的限定更进一步, 在该隔离级别下,一个事务的更新操作结果只有在该事务提交之后,另一个事务才可能读取到同一笔数据更新后的结果。 所以,Read Committed可以避免Read Uncommitted隔离级别下存在的脏读问题, 但,无法避免不可重复读取和幻读的问题。
可重复读(RR): Repeatable Read隔离级别可以保证在整个事务的过程中,对同一笔数据的读取结果是相同的,不管其他事务是否同时在对同一笔数据进行更新,也不管其他事务对同一笔数据的更新提交与否。 Repeatable Read隔离级别避免了脏读和不可重复读取的问题,但无法避免幻读
串行
多个事务读可能会存在以下问题
脏读:事务B读取事务A还没有提交的数据
不可重复读:不可重复读取是指同一个事务在整个事务过程中对同一笔数据进行读取,每次读取结果都不同。如果事务1在事务2的更新操作之前读取一次数据,在事务2的更新操作之后再读取同一笔数据一次,两次结果是不同的,所以,Read Uncommitted也无法避免不可重复读取的问题
幻读: 幻读是指同样一笔查询在整个事务过程中多次执行后,查询所得的结果集是不一样的。这两个区别在于,不可重复读重点在一行,幻读的重点 ,返回的集合不一样