本质上相当于书的目录,通过目录就可以快速的找到某个章节对应的位置,而不用线性的遍历,索引的效果就是加快了查找的速度. 但是索引也提高了 增 删 改 的开销,加入索引,进行增删改就需要调整已经创建好的 索引(目录)了.索引也提高了空间的开销,构造索引需要额外的硬盘空间来保存
查看索引
show index from 表名
查看学生表的索引
show index from student;
表里面如果有主键,主键这一列就会自动创建索引,unique 和 foreign key也会自动创建索引,
这里的student表中,id是主键,因此自动创建了索引
创建索引
create index 索引名称(自己起的) on 表名(需要创建索引的列名);
给学生表中的学生名称列添加索引
create index student_idx_name on student(name);
删除索引
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 严格串行化,解决脏读+不可重复读+幻读,隔离性最高,执行速度最慢