概述
索引
- 什么是索引:排好序的数据结构
- 红黑树:
规则:
(1)根节点和叶子节点都是黑色
(2)每个红节点的两个子节点都是黑色的
(3)从任一节点到叶子节点的所有路径都包含相同数目的黑色节点
3. B树和B+树:
定义:都是每个节点最多包含m个孩子(m>=2)
优势:每个节点默认是一页数据,每页16KB,索引以文件的形式存储到磁盘上,每次在磁盘中读数据,然后在内存中进行比较(内存中比较比较快),且可以进行二分查找。
4. B树和B+树的区别
- B+树的非叶子节点不存储data,只存储索引(有冗余),B+树的叶子节点之间有双向指针,B+树的叶子节点包含所有索引字段和数据。
- B树每个节点既有索引又有data,且叶子节点之间没有指针联系。
索引优化
- 使索引失效的条件:
(1)有or必需全有索引;
(2)复合索引未用左列字段;
(3)like以%开头;
(4)需要类型转换;
(5)where中索引列有运算;
(6)where中索引列使用了函数;
(7)如果mysql觉得全表扫描更快时(数据少);
存储引擎(针对表)
- MyISAM(非聚集索引,b+树)
对应三个文件,除了frm文件外.MYI文件存储表的索引,.MYD文件存储数据。在结构上,索引的叶子节点存储的元素是索引所在行的地址,所以在查找完索引文件之后,还需要在数据文件中定位数据,即两次io。
2. InnoDB(聚集索引 b+树)
对应两个文件除了结构frm文件外,另一个文件即存储了索引又存储了数据。在结构上,innoDB的叶子节点存储的元素是存储所在行的其他列数据。
3. 聚集索引和非聚集索引
- 聚集索引(聚簇索引)的叶子节点包含完整的数据记录,索引和索引所在行的其他数据都在叶子节点上,innoDB的主键索引就是聚集索引(聚集索引一般用primary key来约束)。(聚集索引)
- 非聚集索引(稀疏索引):数据和对应的磁盘文件地址没有放在一起。先找到地址,在根据地址找行数据。
- 为什么建议innoDB建主键,且推荐整形的自增主键
- InnoDB中通过建立B+索引树组织数据存储,主键自建索引,不设置主键则从第一列开始找一个每一个数据都是唯一的数的列来当成索引来组织B+树,如果没有找到,则给你建一个影藏列,来维护B+树的索引。Mysql资源宝贵,建立维护自建的隐藏列消耗资源,所以建议必须建主键。
- 为什么推荐用整形自增呢?(数据库不是分布式的推荐)整形比大小比较快,字符串等其他形式比较教慢,且节省存储空间,为什么自增呢?数据库除了b+树,还有hash结构存储索引,hash某些场景下效率高,但是不支持范围查找。B+树的双向指针使得对于范围查找更简单(同级由左到右递增)。那为什么最好递增呢?如图,,如果继续插入6,由于索引由左往右依次递增,但是6节点应在的位置已满,则会分裂为,分裂效率低,且有可能树会旋转调整,消耗资源。若自增,则一直往索引后插元素,分裂次数很少。
4. 联合索引 索引覆盖 回表
- 联合索引:多个字段上建立的索引,能够加速复合查询条件的检索。联合索引有最左前缀原则,逐个字段比对,第一个字段如果能排除顺序则就按第一个字段,如果第一个字段相同,则比第二个字段,都相等比第三个字段。
由于最左前缀法则,不能跳过前面的字段,用后面的,则只有1是走索引。为什么不能跳过呢?因为是按照建立索引字段的 顺序来建立索引树的,
先按name排序,name相同才按age排序,直接找age的话,只看age未排序,故不能走索引。只能全表查找。
2. 回表:若创建索引的是键的其他字段,那么在叶子节点中存储是该记录的主键(其他字段另外创建了一个索引树),然后再通过主键索引找到对应的记录,IO较多,叫做回表。
3. 索引覆盖:防止回表,通过索引就能查找到需要的数据。
因为普通字段建立的索引树的叶子节点也有primary key的数据,所以select id不需要回表,而select *需要再查询pk的B+树。
事务
- 什么是事务:所谓的事务,它是一个操作序列,这些操作要么都执行,要么都不执行。
- 为什么有事务:事务的提出主要是为了解决并发情况下保持数据一致性的问题。
- 事务的语句:
开始事务:BEGIN TRANSACTION(事务)
提交事务:COMMIT TRANSACTION(事务)
回滚事务:ROLLBACK TRANSACTION(事务)
1. 四个属性(ACID):
原子性:Atomicity:要么一次性全部提交,要么回滚(undoLog来保证)
一致性:Consistency :数据库从一个正确的状态到另一个正确的状态(其他三个特性保证)
隔离性:Isolation :并发的事务是相互隔离的(MVCC保证)
持久性 :Durability: 一旦事务提交,数据库中数据状态永久保存在数据库中(redoLog)
2. 隔离级别
通过锁来保证MVCC机制
3. mysql的锁
按锁力度分类:
- 行锁:锁一行
- 表锁:锁一个表
- 间隙锁:锁一页
还可以分为:
共享锁:可以加读锁,不能加写锁。
排他锁:不能加读锁,也不能加写锁。
还可以分为:
乐观锁:通过版本号
悲观锁:比如行锁、表锁等,直接获取锁
Mysql(默认可重复读)
- 多版本并发控制(MVCC)
读已提交默认读最新的已经持久化的历史版本,可重复读读的是当前事务开始之前的那个历史状态,所以可重复度可以避免不可重读的问题。
2. 什么是脏读、幻读、不可重复读。怎么处理?
处理的方式有很多种:加锁、事务隔离、MVCC
脏读:读到了还没有提交的数据。写时可以通过加排他锁,直到事务提交才释放,读时可以加共享锁。
不可重复读:两次读取的数据不一样,写数据加排他锁,读数据的时候加共享锁。
可重复读:MVVC机制,通过readView
幻读:Innodb的rr通过间隙锁和next-Key锁解决的。
- 并发事务处理带来的问题
- 分布式事务解决方案和优缺点
最后
以上就是彩色奇异果为你收集整理的mysql-java后端面试(自用笔记,更新中)的全部内容,希望文章能够帮你解决mysql-java后端面试(自用笔记,更新中)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复