大厂头条 「Java开发工程师」一面-----「2020年初最新面试题」


博主将会针对Java面试题写一组文章,包括J2ee,SQL,主流Web框架,中间件等面试过程中面试官经常问的问题,欢迎大家关注。一起学习,一起成长。



题一:

Mysql索引结构,聊一聊Mysql查询优化。

结构:

B+树索引并不能找到一个给定键值的具体行,它找到的只是被查找数据行所在的页,接着数据库会把页读入到内存,再在内存中进行查找,最后得到要查找的数据。数据的读取是精确到页的,因为页是计算机管理存储器的逻辑块,IO的磁盘读取,每次都读取数据的大小是一个页大小的整数倍。假设B+Tree的高度为h,一次检索最多需要h-1次I/O(根节点常驻内存),复杂度O(h) = O(logmN),m指的是一个节点存储的数据的个数。实际应用场景中,M通常较大,常常超过100,因此树的高度一般都比较小,通常不超过3。Mysql索引的数据结构之所以选择B+树而不是B树,是因为它内节点不存储data,这样一个节点就可以存储更多的key。

查询优化:

  • 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
  • 2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
  • 3.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描。
  • 4.应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描。
  • 5.能用exists,就尽量不用in。尽量不写like 左边使用%,否则将导致引擎放弃使用索引而进行全表扫描。
  • 6.in 和 not in 也要慎用,否则会导致全表扫描。
  • 8.应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。
  • 9.应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。
  • 10.不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。

题二

表table_demo有A,B,C,D四列,建立了index(A,C,D) 。查A = xx and D = xx可以吗? 查C = xx and D = xx可以吗? 查C = xx and A = xx可以吗?

答:ACD是表demo组合索引,mysql组合索引满足最左原则,所以第一个查询条件和最后一个查询条件会用到索引,不用全盘检索查询速度较快。

拓展:

1.为什么不对所有列创建索引呢?是为了减少开销:假如对col1、col2、col3创建组合索引,相当于创建了(col1)、(col1,col2)、(col1,col2,col3)3个索引。
2.可自行测试查询条件是否有用到索引,用EXPLAIN对查询语句测试。

题三:

给定数组nums=[1,2,3,2,3,5,4],和一个常数K,找到有没有可能将nums分成k个子集,

使得每个子集的和相等 (5),(1,4),(2,3),(2,3) 。本题笔试上机时间为30分钟。

来看看楼主写的代码吧,大概花了25分钟,不清楚是否有bug,仅供参考。

no bb,show code:




运行结果:


原文链接:,转发请注明来源!