mysql
MySQL中InnoDB的采用的索引结构是什么?
- 采用的是B+树,
- B+树的高度更低, 叶子结点存在在磁盘中这样访问速度就更快
- 在运行的时候, 更时候将索引存在到内存中
- B+树更加的适合范围查询, 树的叶子结点存放的区间的中间值, 更适合二分查找
MySQL的如何查看执行计划:
是用Explain 加上对应的SQL语句,主要用来查看使用的索引
- 减少磁盘IO
- 减少CPU消耗
sql EXPLAIN SELECT * FROM your_table WHERE your_condition;
MySQL的组合索引在什么时候会结束?
组合索引遵循最左匹配原则
<a, b, c>
- 如果a的值是确定的, 那么b的值就是有序的, 如果b的值也确定了, 那么C的值就是有序的
- 如果a的值不确定, b,c的值都不确定
- a =1 and b=2, 这样a, b的值都确定就可以了
- a=1 or b=2, 这样a, b的值都不确定
MySQL的锁机制
在MySQL中, 锁非常了很多种:
- 从锁的范围来看分成了全局锁, 表锁, 行锁
- 从拍它性上来看的话, 可以分成拍它锁和表锁, 同时也分成了拍它意向锁和拍它共享锁
- 还有三个比较重要的锁, 记录锁、间隙锁和邻键锁
mysql 的事务
mysql中的事务类型主要分成了四种, 可重复读, 读未提交,读已提交,串新华
- 在读未提交中可能导致出现脏读, 读取到别的事务回滚之后的数据
- 在读提交的情况下不会出现脏读, 但是可能出现不可重复读的情况下, 也就是在一行的情况下面读取到不同的值
日志系统
- undo log: 回滚日志, 它记录了事务执行过程中被修改的数据, 当事务回滚的时候, 会根据undo log里面的数据撤销事务的更改,
- 对于 INSERT 来说,对应的 undo log 应该是 DELETE。
- 对于 DELETE 来说,对应的 undo log 应该是 INSERT。
- 对于 UPDATE 来说,对应的 undo log 也应该是 UPDATE。比如说有一个数据的值原本是 3,要把它更新成 5。那么对应的 undo log 就是把数据更新回 3。
- rodo log: 出现这个日志的原因是因为innodb引擎都不是直接操作磁盘的, 而是读写内存里面的buffer pool,然后再把buffer pool里面的数据刷新到对应的磁盘, 但是可能出现一点问题, 那就是当前这个操作可能会失败, 为了解决这个问题, 我们需要先将buffer pool里面的数据写一份到rodo log中
- bin log
mysql的分库分表
- 首先分库分表第一个需要解决的问题就是主键生成
- 常见的组件生成有两种, 第一种是采用uuid这种方式, 另外一种是采用雪花算法
- 第一种采用uuid这种方法完全是不可行的, 因为这种方式生成的主键不是递增的, 这样就会导致出现页分裂的情况
- 采用雪花算法是比较好的, 首先雪花算法这种方式可以根据业务自定义对应的id, 而且是可以做到自增的
- 但是雪花算法我们需要处理 id 好惊的问题, 这个时候我们可能需要让业务延延迟ms
- 同时在使用雪花算法的时候, 我们也需要注意id积压的问题, 比如某个id的表出现特别多。要想解决这种问题, 我们可以从一个随机数开始
redis
简单介绍一下redis的常见数据结构
简单说明一下redis为什么单线程高性能的性能如何保持的