一,什么是索引
简单来说,就是目录,其目的就是为了提高查询的效率,快速定位
但会消耗小部分空间,降低增删改的效率
二,如何使用索引
1.创建索引
create index 索引名 on 表名/列名 ;
注意:
1.主键自带一个索引
2.表中数据较多时可能会卡死数据库
2.显示索引
show index from 表名;
3.删除索引
drop index 索引名 on 表名;
三,索引背后的数据结构是啥样的
1.哈希表?
漏!哈希表虽然速度快,但只能查询值相等的情况 ,当进行比较大小的范围查询则不支持
2.二叉搜索树?
也漏!数据库数据特别多时,树的高度会异常的高(logN),不太合适
3.B树?
也不完美
B树也是一个N叉搜索树,每个节点包含N-1个值,也可能更少
N-1个值,就把区间分为N个
B树的值不能重复出现
这样做,比二叉树高度减小,IO次数降低
4.B+树!
N个值分为N个区间
B+树的值可以重复出现
观察叶子节点:12 —> 345 —> 678 —> 9 10 11 —> 12 13 14 15
正因为叶子节点是全集数据,只需要把所有的叶子节点,以链表形式首尾相连,方便范围查找
此时,非叶子节点只需要保存索引即可,在内存中缓存,来减少硬盘IO
三,事务
1.什么是事务
原子性:一系列不能分割的事(要么全部成功,要么全部失败)
事务就是维持原子性的一组操作
事务的回滚(rollback):在事务的执行过程中,MySQL会保存每一步执行记录,一旦出现问题就可以根据记录来回滚
2.事务的使用
(1).开启事务
start transaction;
(2).执行多条SQL语句
(3).回滚或提交:rollback/commit
3.事务的特性
原子性:事务的根本,事务执行中,进行一系列不可分割的操作
一致性:事务执行前后,数据处在“一致”的状态
持久性:事务的改动,都是写在硬盘里,不会随着程序重启/主机重启而丢失
隔离性:多个事务并发执行的时候,事务之间能够保持“隔离”,不互相干扰
4.如何解决事务的脏读问题
类似考试的时候,有人故意写错误答案给别人抄,后面他又偷偷改了。
可以对写操作加锁,
加锁前,并发性高,隔离性低;加锁后,隔离性高,并发性低
5.隔离级别的四种档位
平衡效率和准确性
从上到下,准确性提高,效率降低
1.read uncommitted
2.read committed
3.repeatable read
4.serializable