索引
什么是索引
类似于书籍的目录,是为了加快查找速度存在的东西,可以快速定位,检索数据,索引对于提高数据库的性能有很大帮助,可以对表中的一列或者多列创建索引,并且指定索引类型,各类索引有各自的数据结构实现。
索引的内部结构长啥样
回想我们数据结构学到的各种,线性表作为索引的话,通过下标访问,好像和原本的相比完全没有变化呀,二叉搜索树的高度会随着节点个数的增多,变高,不太方便,哈希表只能进行值相等的查找,不太方便。
这时就有一个B+树(N叉搜索树)
结构如下图
具有这些特点:
1.父节点里面的值,会作为子节点的最大值出现(也可以是最小值)目的就是让所有叶子节点就包含了整体数据的全集
2.叶子节点按照顺序通过链表的方式连接起来了,这个时候,就可以很方便很高效的实现范围查找了
3.每一行数据的其他列信息,只存于叶子节点上,非叶子节点仅仅包含索引列的数据(占有的空间就比较少了,就可以把这部分内容直接放到内存中,后续查找的时候,就可以只要去读内存,减少了很多次的磁盘操作)
索引分类
聚簇索引:把数据的每一行数据都给放到索引结构中
非聚簇索引:把数据的每一行还是按照顺序在磁盘上存储,索引里面除了存储这个用来构建索引的列之外,再存储一个行号或者主键id
索引的操作
查看索引
show index from 表名;
创建索引
对于非主键、非唯一约束、非外键的字段,可以创建普通索引
create index 索引名 on 表名(字段名);
创建班级表中,name字段的索引
create index idx_classes_name on classes(name);
删除索引
drop index 索引名 on 表名;
事务
事务是什么
事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。
在不同的环境中,都可以有事务。对应在数据库中,就是数据库事务。
最简单的例子就是转账,要从一个账户转出,又要转入到另一个账户,要是中途出现意外,语句只执行了一半,那么数据不就全错了,回也回不去了。
事务的特性
1.原子性(是个整体,不能再分割了)
2.一致性,事务执行完毕后,数据仍然是合理的(合理性程序员来定义的)
3.隔离性,并发执行事务所产生的问题和解决方案:尽管多个事务并发执行,单系统必须保证,每个事务都感觉不到系统中有其他事务在并发执行
4.持久性,一个事务成功完成之后,它对数据库的改变必须是永久的,即使系统出现故障
MySQL并发执行事务可能产生的问题
1.脏读
事务A在修改数据,另外一个事务B直接就读取A正在修改的数据,此时B读到的数据就是脏数据,因为此时B读到的数据很有可能就在A的后续操作中又进行了修改,相当于B读到数据只是一个中间状态,这就是脏数据,这个动作即为脏读.
防止:给写操作加锁
2.不可重复读
事务A修改数据然后提交,提交完毕事务B开始读取数据
事务B中包含了很多次的读操作,如果事务B两次操作得到的结果不一样,就是不可重复读
原因是事务A虽然把数据已经提交了,但是可能又执行了一次事务A,又把这个数据给改了
事务B第一次读到的数据是事务A提交的,第二次读到的数据是事务A又提交了一次的
防止:给读操作加锁
3.幻读
事务B正在读取数据,事务A,插入到新的数据/删除了某个数据,事务B两次读取到的数据集的个数发生了变化;
防止:串行化,彻底的让事务之间串行执行,此时就没有涉及到任何并发的事了
MySQL中事务的隔离级别
1.read uncommitted 没有做出任何隔离性的限制,三个问题都存在
2.read committed 相当于进行了写加锁,并发程度降低了,隔离级别就提高了,脏读问题解决,其 他两个还在
3.repeatable read 相当于读写加锁,并发程度又降低了,隔离性又提高了,现在只有幻读还未解决(MySQL的默认隔离级别)
4.Serializable 串行化,并发程度最低,隔离性最高,问题都解决了,执行效率也是最低的.
转载:https://blog.csdn.net/weixin_45070922/article/details/115857787