由于今天时间有限,并且使用zookeeper api的demo代码编写不当,因此本篇文章有点难产,笑哭~。这里整一篇Mysql年前的面试总结。还有其他几篇,本篇介绍Mysql方面的内容。
二、数据库(MySql)篇
1.有表结构:学生姓名,课程id,分数三个字段,如何查到平均成绩大于85分的同学姓名?
答案:SELECT student.id, student.stdentname,AVG(student_score.score) AS a FROM student_score, student
WHERE student.id = student_score.studentid
GROUP BY student_score.studentid HAVING a>=85
参考:https://www.cnblogs.com/yuanyuan2017/p/11376305.html
2.MySQL的存储引擎有哪些
答:InnoDB,MyIsam,Memory,Merge,Archive,Federate,CSV,BLACKHOLE
3.Mysql的InnoDB存储引擎和MyIsam存储引擎的区别
1.缓存上InnoDB会缓存数据和索引,MyIsam仅仅缓存索引
2.事务上InnoDB支持事务,MyIsam不支持
3.锁实现上InnoDB自己管理,支持多种锁的形式(表锁,行锁,页级锁等),MyIsam由mysql管理,只支持表锁。
4.文件数据存放上也不一样,索引的数据结构也不一样
5.当然查询表数据的count也不一样,InnoDB需要逐行扫描计算count,MyIsam已经记录count了,所以可以很快返回。
参考:https://www.cnblogs.com/yueshutong/p/10721896.html
4.Mysql的InnoDB存储引擎底层数据结构是什么?
答:B+树(聚簇索引和非聚簇索引)和自适应Hash(对字典进行查找)
相关链接:https://blog.csdn.net/linjiaen20/article/details/85222088
5.Mysql的存储引擎是基于表的还是基于库的?
答:基于数据表的,最明显的特征就是新建表的时候可以指定使用哪种存储引擎
相关链接:https://www.cnblogs.com/fzz9/p/8968649.html
6.假如有一张表x(a,b),已给a,b加联合索引(a,b)请问a = ? and b=? 和 a= ? 这俩能命中索引吗
答:可以命中索引,因为a,b联合索引有如下形式a索引,b索引,a,b索引,通过最左原则(左前缀原则)可以知道这两种情况都可以命中索引
相关链接:https://blog.csdn.net/qq_42630887/article/details/97113323
https://blog.csdn.net/wdjxxl/article/details/79790421
分析:这里其实考察了一个联合索引的使用以及MySQL的最左原则(左前缀原则),笔者算是了解了一点但是没有深入。
7.假如有一张表x(a,b,c,d,e),已给a,b,c加联合索引(a,b,c)请问c = ? and b=? and a = ? 和 a= ? 这俩能命中索引吗? 那a = ? and b>? and c=?能命中索引吗(主滴滴)
答:c = ? and b=? and a = ?可以命中索引,因为Mysql会帮忙优化成a=? and b=? and c=?这种形式,所以可以命中索引。
a= ?也可以命中索引。
a = ? and b>? and c=? 只能命中 a索引,因为b索引是使用了>符号导致b,c索引无法命中。
因为a,b联合索引有如下形式a索引,b索引,a,b索引,通过最左原则(左前缀原则)可以知道这两种情况都可以命中索引
相关链接:https://blog.csdn.net/qq_42630887/article/details/97113323
https://blog.csdn.net/wdjxxl/article/details/79790421
8.MySQL的InnoDB存储引擎下为啥使用B+树索引
答: 1.提高查询和插入效率(减少IO),提高磁盘存储效率
2.可以实现顺序插入访问和随机插入访问
分析:这里想要表达的意思是b树和b+树的区别和使用场景
相关链接:
https://www.cnblogs.com/tiancai/p/9024351.html
https://zhuanlan.zhihu.com/p/97601681
9.什么是聚集(聚簇)索引和非聚集索引
答:
聚集索引:数据行的物理顺序与列值(一般是主键的那一列)的逻辑顺序相同,一个表中只能拥有一个聚集索引。
非聚集索引:该索引中索引的逻辑顺序与磁盘上行的物理存储顺序不同,一个表中可以拥有多个非聚集索引。
非聚集索引包括:普通索引,唯一索引,全文索引
相关链接:https://www.cnblogs.com/s-b-b/p/8334593.html
10.MySQL回表是什么意思?为什么会回表?怎么避免回表查询?
答:非聚集索引叶节点仍然是索引节点,只是有一个指针指向对应的数据块,此如果使用非聚集索引查询,
而查询列中包含了其他该索引没有覆盖的列,那么他还要进行第二次的查询,查询节点上对应的数据行的数据。
查询过程中如果不需要查非索引的其他字段就不要查,也就是说只查带索引的字段,可以避免回表,提高查询速度。
相关链接:https://www.zhihu.com/question/347087093/answer/830934717
https://www.cnblogs.com/s-b-b/p/8334593.html
![](/qrcode.jpg)
11.MySQL索引覆盖是什么意思?
答:索引覆盖的意思就是如果一条查询sql中查询的条件全是索引列则不需要进行回表,在索引数据中就可以返回。
12.什么情况下可以使用B树
答:存储多级数据
13.Mysql一条sql的执行过程?
答:先由客户端将sql语句传入mysql服务端,mysql服务端有多个层,每个层之间基本独立不互相影响,
服务层有链接器,然后先通过查询缓存判断有没有数据,然后通过分析器,优化器和执行器进行sql语法树的解析,执行计划的生成,最后通过
存储引擎层提供的数据读写api对数据进行实际的读写
参考:https://www.cnblogs.com/gusluo/p/11250863.html
14.Mysql底层是B+树?为啥选择B+树?
答:准确的说Mysql有很多类型的存储引擎,其中InnoDB底层使用的是B+树,使用B+树可以提高查询和插入效率(减少IO),提高磁盘存储效率
另外可以实现顺序插入访问和随机插入访问