数据库
1. 事务的四大特性
原子性:不可分割的单元,事务中的所有操作,要么全部成功,要么撤回执行事务之前的状态。例如:转账A减钱,B加钱。
一致性:如果执行事务前数据库是一致的,那么在执行事务之后数据库也是一致的。例如:转账前A和B总金额是一万元,转账后总金额也是一万元。
隔离性:一个事务的执行不应该受到其他事务的干扰。
持久性:事务一旦提交,其结果就是持久化到数据表中,永久储存。
2. Mysql的事务隔离级别
读未提交(脏读):一个事务读取到了另外的一个事务还没有提交的数据。
读已提交(不可重复读):一个事务读取到了另外一个事务已经提交的修改数据
可重复读(虚读):一个事务读取到另外一个事务的添加数据。
串行化读:一个事务在操作一张表的时候,另外一个事务必须等待其他事务操作完毕,才可以操作该表。
效率从高到低是:read uncommitted>read committed>repeattable read> serializable
3. mysql中的锁
排他锁(X锁):可读可写,一个事务对标加了X锁,其他事务必须等待该事务操作完成这张表后,才可以对这张表进行操作。
共享锁(S锁):只读,多个事务可以同时对某一张表加共享锁。
活锁:有几率解开,某个事务处再永远等待的状态,得不到封锁的机会,这种现象称为活锁。
死锁:肯定解不开,两个或者两个以上的事务都处于等待状态都在等待对方事务接触封锁。
4.索引
索引是数据库管理系统中的一个排序的数据结构,以协助快速查询,更新数据。索引的实现通常使用的是B+Tree索引,它加速了数据访问,存储引擎不会再去扫描整个表得到需要的数据相反,它从根节点开始,根节点保存了子节点的指针,存储引擎会根据指针快速寻找数据。
MyISAM的叶节点的data域存放的是数据记录的地址,也就说说MyISAM索引文件和数据文件是分离的。索引文件仅仅是存储数据记录的地址。索引检索的算法为首先按照B+Tree搜索算法搜索索引,如果指定的key存在,则取出其data的值,然后以data域的值为地址,读取响应的数据记录。索引方式叫非聚集索引。
InnoDB引擎也是使用B+Tree作为索引结构,但是InnoDB的数据文件本身就是索引文件,叶节点保存了完整的数据记录,这个索引的key作为数据表的主键。这种索引就是聚集索引。
5. Mysql的四大索引
index:普通索引,数据可以重复,没有任何限制。
unique:唯一索引,要求索引列的值必须唯一,但允许有空值,如果是组合索引,那么组合必须唯一。
primary key:主键索引,是一种特殊的唯一索引,一个表只能有一个主键,不允许是空值。
组合索引:在多个字段上创建索引,只有在查询条件使用了第一个字段,索引才会被引用。
6. sql语句分类
DDL:数据定义语言(create,drop)
DML:数据操作语言(insert,update,delete)
DQL:数据查询语言(select)
DCL:数据控制语言(grant,revoke)
TPL:数据事务语言(commit,rollback)
7. 数据库三范式
第一范式:对属性原子性约束,要求字段具有原子性不可分割。
第二范式:非主键字段不能出现部分依赖主键,一是表必须有主键,二是非主键列必须完全依赖于主键,不能只依赖于主键的一部分
第三范式:非主键列直接依赖于主键,不能存在传递依赖
8. 存储引擎MyISAM和InnoDB区别
- InnoDB支持事务,MyISAM不支持事务。
- MyISAM适合查询和插入为主的应用,InnoDB适合频繁的修改以及涉及安全性能较高的应用。
- InnoDB支持外键,MyISAM不支持
- MySQL5.5以后默认的引擎是InnoDB
- MyISAM支持全文检索,InnoDB不支持全文检索。
- InnoDB不保存表的具体行数,select count(*) from table;会全表扫描。而MyISAM用一个变量保存了整个表的行数。
- 锁机制不同:InnoDB是行级锁,MyISAM是表级锁。
9. char和varchar的区别
- char和varchar类型在存储和检索方面不同。
- char的长度是固定的,建表时声明,长度范围是1-255
- 当char值被存储时,它会被空格填充到特定长度,检索时会删除尾部的空格。
10. MySQL中有几种锁
MyISAM支持表锁,InnoDB支持表锁和行锁,默认是行锁。
表级锁:开销小,加锁快,不会出现石锁,锁定粒度大,大声锁冲突的概率高,并发量底。
行级锁:开销大,加锁慢,会出现死锁,锁定粒度小,发生锁冲突概率低,并发度高。
11. 存储过程
我们常用的sql语句在执行的时候需要先编译,然后再执行,而存储过程是一组为了完成特定功能的sql语句集,经编译后存在数据库里面,用户通过调用指定存储过程,给定参数完成特定功能。
12. delete,drop,truncate区别
truncate和delete只删除数据,不删除表结构,drop删除表结构并且释放所有空间。delete属于DML语言,需要事务管理,commit之后才能生效,drop和truncate数据DML语言,操作后立即生效。
truncate会删除所有记录
delete可以删除部分数据
drop即删除数据又要删除表结构