索引 和 事务

索引

本质上相当于书的目录,通过目录就可以快速的找到某个章节对应的位置,而不用线性的遍历,索引的效果就是加快了查找的速度. 但是索引也提高了 增 删 改 的开销,加入索引,进行增删改就需要调整已经创建好的 索引(目录)了.索引也提高了空间的开销,构造索引需要额外的硬盘空间来保存

查看索引

show index from 表名

查看学生表的索引

show index from student;

 表里面如果有主键,主键这一列就会自动创建索引,unique 和 foreign key也会自动创建索引,
这里的student表中,id是主键,因此自动创建了索引

创建索引

create index 索引名称(自己起的)  on 表名(需要创建索引的列名);

给学生表中的学生名称列添加索引

create index student_idx_name on student(name);

索引 和 事务_第1张图片

删除索引

drop index 索引名称 on 表名

删除学生表的学生名称索引

drop index student_idx_name on student; 

索引的底层实现

 mysql数据库的底层实现不是哈希表,因为哈希表只能比较相等,不能进行范围查询,而是B+树(n叉搜索树,父元素的key会在子元素中重复出现,并且是以最大值出现,因此非叶子的所有值都会在叶子节点中体现出来)

事务

能够把多个sql打包到一起,变成一个整体,要求要么全部执行,要么就都不执行,也就是事务最核心的特性"原子性",如果中间某个sql出错,就进行回滚操作,把执行过的操作逆向恢复回去

开启事务

start transaction 开启事务

comit 提交事务

开启事务之后,中间的 sql 不会立即执行,而是等提交事务之后统一执行

事务的四大特性

1.原子性

2.一致性

事务在执行前和执行后,都处于数据合法的状态.(比如转账,不能出现转的过程出错了,导致钱,丢了的情况)

3.持久性

事务的修改都会写入硬盘,即使程序重启/主机掉电,事务都可以正常工作,保证修改是生效的

4.隔离性

一个数据库服务器,同时执行多个事务的时候,事务之间的影响程度
如果事务的隔离性越高,就意味着事务之间的并发程度越低,执行的效率越慢,但是事务的准确是越高
如果事务的隔离性越低,意味着事务之间的并发程度越高,执行的效率越快,但是数据的准确性越低

mysql 的隔离级别

脏读:读到了一个错误的有问题的数据,比如事务A在写数据,事务B要读事务A写的数据,事务B读完就结束了,此时事务A继续写数据,或者把之前的数据删除了,此时事务B读到数据就是一个错误的数据

解决方法:给写操作加锁(写的时候不能读)

不可重复读:在一个事务中,连续俩次读到的数据不一样(事务B正在读事务A的数据,此时事务A对自己的数据进行修改,就会导致连续俩次读到的数据不一样产生脏读问题)

解决方法:给读操作加锁(读的时候一样不能写)

幻读:同一个事务中,俩次读到的结果集 不同(事务A去写事务B正在读的数据,但是可以修改其它的数据,可能就会导致事务A每次读到的结果集不同)

解决方法:串行化(放弃并发执行

mysql提供的四个隔离级别机制

1.read uncommitted 不作任何限制,事务之间都是随意并发执行的,并发程度最高,隔离性最低,.会产生脏读+不可重复读+幻读

2.read commited写操作加锁,解决脏读问题,存在不可重复读+幻读

3.repeatable read写和读都加锁 解决了脏读和不可重复读

4.serializable 严格串行化,解决脏读+不可重复读+幻读,隔离性最高,执行速度最慢

你可能感兴趣的:(数据库,索引)