Mysql学习总结
mysql所以为什么是B+树?
索引数据结构:
- 二叉搜索树
如果用二叉搜索树作为索引结构,当插入一个自增的列时,就变成链表了(因为插入比根节点小的数会放到左节点,比根节点大的数在右节点),这样查询的复杂度还是O(n),还额外增加索引的存储空间 - 红黑树(二叉平衡树)
当一边过高时,红黑树会自动平衡高度,磁盘IO次数比二叉搜索树少一半。缺点:真实场景中数据量庞大,树的高度很高,如果数据在叶子节点,查询性能很低
思考:我们希望树的高度低一点,比如h≤4,那么最多查四次即可。可以让一个索引节点存储空间大一点,有更多的分叉,树的高度就越小
- B树
- 叶子节点具有相同的深度,叶节点指针为空
- 所有索引元素不重复
- 节点中的数据索引从左到右递增排列
4. B+树 - 非叶子节点不存储data, 只存储索引,可以放更多索引
- 叶子节点包含所有索引字段
- 叶子节点用指针连接,提高区间访问的性能
聚集索引和非聚集索引
聚集索引:数据都在叶子节点上
非聚集索引:与之相反
为什么建议InnoDB必须建主键,并且推荐使用整形的自增主键?
为什么主键:底层B+树需要根据主键来维护索引记录,mysql会在后台自动维护一个隐藏列(row_id),在有效性的角度,我们自己来建一个这样的列比较好,这样就不用mysql去做了,提升效率
事务的隔离级别?带来的问题?如何解决?
- 读未提交。当前事务能看到其他事务未提交的数据,有脏读,不可重复读,幻读问题。
- 读已提交。一个事务开始时,只能看见已提交事务所做的改变。解决了脏读,但有不可重复读,幻读的问题。
不可重复读:事务B在事务A的两次查询语句之间进行了修改并提交,A两次查询的内容就不一样了
- 可重复读。保证同一事物的多个实例在并发读取事务时,会看到同样的数据行。解决了不可重复读的问题,但有幻读问题
- 可串行化。强制事务排序,使之不可能产生冲突
MVCC解决幻读问题
事务的四大特性
都用转账来举例
- 原子性(atomicity)
指事务是一个不可分割的单位,要么全部提交,要么全部失败回滚,不存在中间的状态(想象成物理世界的最小单位-原子)如果没有原子性,就会发生数据不一致的情形,比如A账户转账100元,B增加100元失败,则无故丢失100元 - 一致性(consistency)
事务执行前后,数据从一个合法状态变换到另一个合法性状态,合法的数据状态指的是满足预定的约束的状态
举例1:A有200元,转300出去,剩-100,如果定义了状态:余额≥0,则此时不满足一致性
举例2:A有200元,转50给B,A剩150,B增加失败,此时如果我们限制A和B的总和应当不变,则不满足一致性。 - 隔离性
一个事务的执行不被其他事务干扰,即一个事务的内部操作及使用的数据对并发的其他事务时隔离的,并大执行的各个事务之间不能相互干扰 - 持久性
事务一旦被提交,对数据库的改变是永久性的,通过事务日志来保障的
总结:原子性是基础,隔离性是手段,一致性是约束条件,持久性是目的
数据库索引
什么是索引?
索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B+树的形式保存。如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录。表里面的记录数量越多,这个操作的代价就越高。如果作为搜索条件的列上已经创建了索引,MySQL无需扫描任何记录即可迅速得到目标记录所在的位置。如果表有1000个记录,通过索引查找记录至少要比顺序扫描记录快100倍。
数据库索引类型有哪几种?
主键索引:主键是一种唯一性索引,但它必须指定为“PRIMARY KEY”。每个表只能有一个主键。
唯一索引;这种索引和前面的“普通索引”基本相同,但有一个区别:索引列的所有值都只能出现一次,即必须唯一。主键一定是唯一索引,唯一索引不一定是主键
普通索引:这是最基本的索引类型,而且它没有唯一性之类的限制
全文索引:全文索引技术是搜索引擎的关键技术
组合索引;
按数据结构分:
BTree索引;
B+Tree索引;
哈希索引;
全文索引;
主键和索引的区别?
索引的区别以及应用场景?
为什么elastic search比mysql全文索引更适合?
待更新