小史是一个应届生,虽然学的是电子专业,但是自己业余时间看了很多互联网与编程方面的书,一心想进BAT互联网公司。

  5wjZtXcRpZnFQptISSCGzXPcY1xbqhpm5iRhyKeceYUsk1545395138923.jpg

  话说两个多月前,小史通过了A厂的一面,两个多月后的今天,小史终于等到了A厂的二面。

  简单的自我介绍后,面试官看了看小史的简历,开始发问了。

  fbSyIXdAwbs7QLwegZyvlVy2Yw0N8cjpJjpW7uEV1=yEW1545395138923.jpg

  【面试现场】

  v4hx=Hk70DmNDLZgpUHoewJF22qBXINb3AcQYyQnOvqcB1545395138924.jpg

  8d7KV1pjI=IhVjGviFAkxx=ADaIFtHoJ306dDicUozMIO1545395138925.jpg

  小史:没问题,这个项目前端用的react+webpack,后端用的nginx+SpringBoot+Redis+MySql,前后端分离的,最后用docker进行容器化部署。主要模块有师生系统、课程系统、成绩系统、选课系统等。

  rFGnVSSEadZw1ighEj65RM52d=F3AA6wKFygBpQxRj6yH1545395138925.jpg

  EaEPMMo2ZcSZHqAqouKprrslwQETGHSgwcfAKcoImTSOC1545395138927.jpg

  3yo9g=GMLBAZ=KbgtHyKXxw3ewqnSXqXtX=CYBueUp26z1545395138927.jpg

  eRS=iM6R6bjP82ksSN9oC1oSBfRWmxo8Qmi0ZFUIt0TLM1545395138927.jpg

  ns1PEz4EfSlA8IvZMAX9bzqQgmR8zQF4NUpKnJPRZGf9L1545395138927.jpg

  这个项目的架构和说辞,小史早已背得溜溜的。

  B09U8yXn6NKQ0=Sl4IsteeUleAmO4jzPE8fAlGtAgad1f1545395138928.jpg

  小史:底层mysql是存储,redis是缓存,dao层操作mysql,cache层操作redis,service层处理业务逻辑,rest api层为前端提供rest接口。前端这边用react进行模块化,webpack打包部署。网关nginx进行负载均衡。mysql、redis、nginx和springboot应用都放在docker里部署。

  GLSpYs7=F73woiCce94BeOAnMRarlebK5JcDoF5E0Xtih1545395138928.jpg

  dmL76gIl2qrSDy2fn6isATgXIY9rRgS31cPMa10VtkMKF1545395138928.jpg

  IWS0AvunuaGxFampqEGiD2Z8UE1NhD0ZQnUkUFoEHRn2C1545395138928.jpg

  x2hwrvAbmSz67doEPwnHUwnFTc7wv1EVrLqYou4AmBCiV1545395138929.jpg

  86L1JGCx1JZCuwLYdLZ==ERk9L3pTcgyCJPz33b5tb4pc1545395138930.jpg

  E30JWOfiU32Ajuloup9qSDLC5T=oYN=X7zojAhQh0UWLl1545395138931.jpg

  tgcJHyvSlhikbDy=XOoVtHNcJ=bdTYsoNAXU25FnjCbmy1545395138931.jpg

  Vwst2iNeHnrnt9uwReppLvXwSfi9XJtI4l8EPajFfF=Or1545395138932.jpg

  ZHtaVhH8vlZFlvKAZDCYtMhuU6qhYhPh3iHY7d1fjbCaO1545395138933.jpg

  HHenCYV6A4RiIO9W7ZmPr7VL5l1vpMJPaU=3h1zITtHnv1545395138934.jpg

  VBIUJ4Ry3g=Z3wYaMjoK24tXAhd317qXPT0AbU5yWBwZW1545395138935.jpg

  iVNrgPtyvRr7VvjnW87e51TeAtMQYMTOr2g4zSCvUBLUz1545395138935.jpg

  4jszuoLYlAAibtLF1OoPVbZu9wKfIyXsLBQhlRYkYoHCM1545395138935.jpg

  4NvJsh2A4FnO5XpgJoJU7Mk0NGy19FXBPy2hHA8CtQUh91545395138935.jpg

  题目:为什么MySQL数据库要用B+树存储索引?

  小史听到这个题目,陷入了回忆。

  【前段时间的饭局】

  话说吕老师给小史讲完人工智能后,他们一起回家吃小史姐姐做的饭去了。

  4kYs0RrSIp7oY2VCZVExorz6KeK0Sdl8gDva=e2Aky9dL1545395138935.jpg

  【饭后】

  FlOle6o6f73PPyCKf6kPTbwNvaqf=4aw5uOcWafYKzqoN1545395138935.jpg

  jcX0LDYjZ3BGY1jkD3qI2yq6BBcNYAs7SXpWMVcsKL7Kw1545395138935.jpg

  吕老师:面试的时候一定是往深了问,不精通的话容易吃亏。不过面试时一般都是根据项目来问,项目中用到的技术,一定要多看看原理,特别是能和数据结构和算法挂钩的那部分。

  89f2Kr1gsM9EHgt9HfoAiJh0=k1vPVmSMImw27vSZ7gIa1545395138935.jpg

  tldLyvTSqmJ3F=PbSIFi=8pPVWyWFkJ3MBm4RPuy1tuEl1545395138935.jpg

  iAIrWpulGQ=YLktBV16To3cOKen6BiWrzjjYZ5TlGSuzt1545395138935.jpg

  小史:树的话,无非就是前中后序遍历、二叉树、二叉搜索树、平衡二叉树,更高级一点的有红黑树、B树、B+树,还有之前你教我的字典树。

  【红黑树】

  AQKwS0PUn=Bfj0y50oEJq7nZfTbZtME0MBe4JMIGdplkp1545395138936.jpg

  一听到红黑树,小史头都大了,开始抱怨了起来。

  83wf8OHtZifiUSGnZuKuOWqS2Ol=dVlzLuAHKVMrDHkkV1545395138936.jpg

  小史:红黑树看过很多遍了,但是每次都记不住,它的规则实在是太多了,光定义就有四五条规则,还有插入删除的时候,需要调整树,复杂得很。

  6bCRzlXoiRTpRSOcWIY4SU8GPgQ=YHKgeqQjQ38mR6Nq11545395138937.jpg

  吕老师:小史,问你红黑树,并不是让你背诵它的定义,或者让你手写一个红黑树,而是想问问你它为什么这样设计,它的使用场景有哪些。

  EJBzwiM6uULBGfNXaFUe8s97mniDnqXpMSLqn0Lc1txuu1545395138937.jpg

  MFlquloRzDJmeeF0pS6wEvGtPlmNlcSNLR1OMPH7Xi74R1545395138937.jpg

  EFCS5S3MwQRRjoi1MLed4KyoDG=CKrCZ3zxOzk05VPTDp1545395138937.jpg

  kex=C1NQLNPnMAA9siR02GkJ61JpqvzI=AcwP4RCmzvB61545395138937.jpg

  4cesGkydrZocIY=WEn7K8jeSoMuEoOvWD5=79twb5vKXA1545395138937.jpg

  wk7jPyrwv=dU2nZPjf=BS8h5uhWkwbz5yP=H4PS32hIux1545395138939.jpg

  N41gOxomzqQ1IITh10lsreBwABCe2AmUv4yeuGXh5=plq1545395138939.jpg

  6CTEAvOvKb6APue153Z74=60AbufMc3Hp=Bkyp2RQrKpu1545395139263.jpg

  yS4ybBInT0nD5oo2VDW5icpd=RPuF2GDGa0OPEQ8DMCTD1545395139266.jpg

  RZdYvjfHw67HGa104yK5qWAlfm8Cr6M86pdRCnHOkgOud1545395139286.jpg

  gYh4oi0=psZnEDEYxhVDk7KHx2WcVLKbTOt=IjCz64u7N1545395139291.jpg

  KrDiVXEH36=mHKouV***7Mg9qkS6Z0KHOUoSjer5WBrFG1545395139319.jpg

  9zo3dfwIDQZWQ6WknIqMIP2iVSDF5TwK74tjIJF0ZWvZt1545395139330.jpg

  0YGlcpBundsVlRtZq1KW6PgdfnBxO31RTepQupf1AdpzJ1545395139332.jpg

  u4P158fYCt8gMZBtWA7uCdjfOv4wXsbshGZLdwSY2HNbE1545395139360.jpg

  【B树】

  0KdK=vbdbaNg59jVPKjdVLH7CPSHx2Otn7kXs56RRtmP61545395139365.jpg

  fpcUbqOQEoXTNQCal5nz5gHzCnZqOPQJnB8qyeAAi37mb1545395139368.jpg

  YW8mehlknvaxPnfK5ASnP0YRcCpUN8FFkoKftc5T3xbaf1545395139386.jpg

  rXUJyNUzigh7MyZquRhLXqs00hoOf5CL4iqWSscW1xu0s1545395139389.jpg

  hG5crp8WVRyjS9xFA6BuTEFaYt4NLhbYPmhJlP2igO7yY1545395139435.jpg

  Kc8w5iQ1f74hyGBl3EJTUfGp63l8khhaVIPQNiuzSOka61545395139436.jpg

  ZRZUFHs15R5mNrXcZTfOqfmwgcrqNkM22JB=nqbH39r3g1545395139438.jpg

  NXSkzDR15T9Su4Uq13P00UxvcHKNA8Z=WBvEPzYF0QBSV1545395139439.jpg

  n4ilDsmwFVi4iQqN6uziJ0SBhTORv6PHASRRZrKEu1d2i1545395139470.jpg

  48ZrB4qhUNAcVgI83oSr0l55QPHlwb6Qwhj240xjDZQCS1545395139489.jpg

  oF1bvgV2Hr1U9646XNWo1Voj4PMn3nwJ6i2o0FR1aEwE31545395139491.jpg

  PSSiZMnI4s3wZTddICJCIib68XJ0EcTRriL8AYE=6TVW=1545395139496.jpg

  VZrY8qUzj6euFrgLrP66IK1aXWQ5jyDZguZJSMKycSmmy1545395139498.jpg

  icJ3Xz22XJdqpF4bcHf7oyQW=1=QVgMsjaDkCXKMCJ4HL1545395139499.jpg

  GjoC5y04Ds0x4DlvxyH9hW9NUABQXply8XWHeXdKKnBhL1545395139500.jpg

  吕老师:小史,你要知道,文件系统和数据库的索引都是存在硬盘上的,并且如果数据量大的话,不一定能一次性加载到内存中。

  xnjo3REHdu0iHWBIYIyAnCmA804NXcZ4uXdLfuC1cQ3031545395139515.jpg

  两个月前,小史面试没考虑内存情况差点挂了

  5gssb85iIFDBwJEsoe9ZULLoGf4DQ5bruN125oCU442RR1545395139532.jpg

  Cp1MJL5sqYiIWoY9z81XGaIU1MEDgIkDY05aF2icg9sYV1545395139534.jpg

  xv9wp4o2UnsrrYrzo7YN3ojzNRE8TktDTLRGMm584rr0t1545395139558.jpg

  TW0E6OBo1UmUUA8qMYibUQxG16VYLo1GFy=xNzwg0eeqm1545395139580.jpg

  n3dh7Hs4anCvqyut932jUjlGVhy4GeskIeqnyVz4b86nH1545395139586.jpg

  【B+树】

  s39gU1mLuSQPchZvVl6H1dJP2zpWBy5HUEC00Ij7LTvwp1545395139589.jpg

  gXCAINnlp7J1xKwte1qr1nwRqvSBQ=VM3GpgaYoQChTh91545395139591.jpg

  Gv2D3GxOd2iBdS2LVd12G7fG=oOrBXnovKUDugVe7sJXF1545395139594.jpg

  KTBne=VXL6eePbgtYJ2SLfifzJW42KyGK4whP9P3UPc4w1545395139599.jpg

  MqP7WYBg1N9cbIkI6d6NYDsKjwcKqtP9wvKa9OwftshAq1545395139611.jpg

  fuzEGGp1qV0Lt=65iDfks2KurNxjROf=KkYVlgV6e1g4n1545395139621.jpg

  5TvKXbQlz1pisJiYEpY2HaWqKeAVAQyT6pXKNvOu=BHQz1545395139621.jpg

  吕老师:这也是和业务场景相关的,你想想,数据库中select数据,不一定只选一条,很多时候会选多条,比如按照id排序后选10条。

  zQRbOW9ULKVkHDVf5orKqAMA=lQJQ8WWFiD2NKm0UESqV1545395139623.jpg

  小史:我明白了,如果是多条的话,B树需要做局部的中序遍历,可能要跨层访问。而B+树由于所有数据都在叶子结点,不用跨层,同时由于有链表结构,只需要找到首尾,通过链表就能把所有数据取出来了。

  nRwHdzuqWKv97RmrIsifrnTEaszSz9sfEpmKdtGxs9UO11545395139627.jpg

  rAmBt46=K91rWqhyaQpob4RBVwxi5H3Y5puah8t4TfOak1545395139633.jpg

  【回到现场】

  LtkaceME8vtpRUmPU1Ndbv70z40vKIKjqauQQpEvdUcZf1545395139649.jpg

  小史:这和业务场景有关。如果只选一个数据,那确实是hash更快。但是数据库中经常会选择多条,这时候由于B+树索引有序,并且又有链表相连,它的查询效率比hash就快很多了。

  nNvgajYujadmrqO8Rx3LebjXmkvyH4AlDFpYK3fWvMo8E1545395139655.jpg

  小史:而且数据库中的索引一般是在磁盘上,数据量大的情况可能无法一次装入内存,B+树的设计可以允许数据分批加载,同时树的高度较低,提高查找效率。

  IpHAade3S=Zv3jMJmoRNTBHKrBmkWh0qJqMa6O01VOn0v1545395139699.jpg

  HR和小史简单地聊了聊基本情况,这次面试就结束了。

  小史走后,面试官在系统中写下了面试评语:

  yfJ5sE4Fa6CwxhahL5aX13t81lr=bBmBgFjUzWuCz2O4v1545395139705.jpg

  几天后,小史收到了A厂的offer。

  D7p8v1NSYYkngIDwJcNKCD6tAkS6SHZgVE2ldjYdV=WZH1545395139718.jpg

  


欢迎工作一到五年的Java工程师朋友们加入我的个人粉丝群Java填坑之路:789337293

群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

YYTsCHdHXDsJJVhOl7ElkVdCgfqcTslYfzUNqM6ZeOsDr1545395139721.jpg