java学习(八)
1、MySQL的索引有了解吗?
索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息,就像一本书的目录一样,可以加快查询速度。InnoDB 存储引擎的索引模型底层实现数据结构为B+树,所有数据都是存储在 B+ 树中的。
2、为什么底层数据结构使用B+树,而不是B树?
- B+树是B树的变种,B+树的非叶子节点只用来保存索引,不存储数据,所有的数据都保存在叶子节点;而B树的非叶子节点也会保存数据。这样就使得B+树的查询效率更加稳定,均为从根节点到叶子节点的路径。
- B+树的内部结点并没有指向关键字具体信息的指针,因此其内部结点相对B 树更小,同样空间可以读入更多的节点,所以B+树的磁盘读写代价更低。
3、聚簇索引和非聚簇索引有了解吗?
聚簇索引也称为主键索引,其索引树的叶子节点中存的是整行数据,表中行的物理顺序与键值的逻辑(索引)顺序相同。一个表只能包含一个聚集索引。因为索引(目录)只能按照一种方法进行排序。
非聚簇索引(普通索引)的叶子节点内容是主键的值。在 InnoDB 里,非主键索引也被称为二级索引(secondary index)。
4、哪些列上适合创建索引?创建索引有哪些开销?
经常需要作为条件查询的列上适合创建索引,并且该列上也必须有一定的区分度。创建索引需要维护,在插入数据的时候会重新维护各个索引树(数据页的分裂与合并),对性能造成影响。
自增主键:
为了在插入数据的时候不需要调整主键索引树的结构,强烈建议在建立表的时候使用自增主键。主键的顺序按照数据记录的插入顺序排列,自动有序。
5、MySQL中where、group by、having关键字?
- where子句用来筛选from子句中指定的操作所产生的的行
- group by 子句用来分组where子句的输出
- having子句用来从分组的结果中筛选行
6、having和where的区别
- 语法类似,where搜索条件在进行分组操作之前应用;having搜索条件在进行分组操作之后应用
- having可以包含聚合函数sum、avg、max等
- having子句限制的是组,而不是行
7、当同时含有where子句、group by 子句 、having子句及聚集函数时的执行顺序
- 执行where子句查找符合条件的数据
- 使用group by 子句对数据进行分组
- 对group by 子句形成的组运行聚集函数计算每一组的值
- 最后用having 子句去掉不符合条件的组
8、从浏览器中输入一个网址,比如:https://www.nowcoder.com/ 之后都发生了啥?请尽可能详细的阐述。
在浏览器中输入一个网址,首先要做的就是域名的解析,也就是域名->ip的解析,依次查看了浏览器缓存,系统缓存,hosts文件,路由器缓存,递归搜索根域名服务器,直到找到最终的ip地址。
然后就是TCP协议的三次握手建立连接,过程我们已经阐述了。由浏览器发送一个HTTP请求;经过路由器的转发,通过服务器的防火墙,该HTTP请求到达了服务器;服务器处理该HTTP请求,返回一个HTML文件;浏览器解析该HTML文件,并且渲染显示在浏览器端。
这里,我们可以来具体阐述下HTTP协议和TCP协议的关系与区别。
HTTP协议和TCP协议的关系与区别:
HTTP协议是一种基于TCP/IP的应用层协议,进行HTTP数据请求必须先建立TCP/IP连接。HTTP协议提供了封装或者显示数据的具体形式;TCP协议提供了网络通信的能力。两个计算机之间的交流其实就是是两个端口之间的数据通信,具体的数据会以什么样的形式展现是以不同的应用层协议来定义的。
根据相关面试及学习进行归纳总结