索引
是一种特殊文件,包含对数据表里所有记录的引用指针。可对表中的一列或多列创建索引并指定索引类型,各类索引都有各自的数据结构实现。
作用:加快检索所需查询数据时间;定义/创建索引;条件查询时where条件使用创建的索引字段
注意事项:MySQL默认引擎使用innodb,索引和数据都保存在本地的同一个文件,会占用磁盘空间;可提高检索数据的效率,但是修改索引字段(插入删除数据)的效率会很低。
使用:创建主键约束(PRIMARY KEY)、唯一约束(UNIQUE)、外键约束(FOREIGN KEY)时,会自动创建 对应列的索引。
查看索引 | show index from 表名; |
创建索引 | create index 索引名 on 表名(字段名); |
删除索引 | drop index 索引名on 表名; |
事务
保证多条sql指令要么同时执行,要么同时失败
使用:
开启事务(start transaction)
try{
执行多条sql
提交事务(commit) // 数据持久化到本地文件中,其他客户端才可见
}catch(Exception e){
事务回滚(rollback) //数据还原到开启事务的时候,开启事务之后执行的操作全部丢失
}
如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性
原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。
一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
不考虑隔离性可能出现的问题
是指一个事务处理过程里读取了另一个未提交的事务中的数据,然后使用了这个数据;
不可重复读是指在一个事务内,多次读取同一个数据,在这个事务还没有结束 ,另一个事务也访问该同一数据,但是由于第二个事务的修改,那么第一个事务两次读取的数据可能不一样,因此称为不可重复读;即同一个事务中原始数据读取不可重复。
注:不可重复读和脏读的区别,脏读是某一个事务读取另一个事务未提交的脏数据; 不可重复读则是读取前一事务提交前和后的数据
当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行修改,这种数据涉及到表中的全部数据行,同时,第二个事务也对这个表数据进行修改,这个修改是对表中新增/删除一条数据,那么操作第一个事务的用户发现表中的数据还没有修改的数据行,就好像发生了幻觉一样,这就是发生了幻读
注:幻读和不可重复读都读取另一条已经提交的事务,所不同的是不可重复读查询的都是同一数据项,而幻读针对的是一批数据整体
隔离级别
01:Read uncommitted(读未提交):最低级别,任何情况都会发生。
02:Read Committed(读已提交):可避免脏读的发生。
03:Repeatable read(可重复读):可避免脏读、不可重复读的发生。
04:Serializable(串行化):避免脏读、不可重复读,幻读的发生。