同事面试遇到的奇怪问题

    近日同事面试资深Java开发工程师在回到MySql索引的时候,遇到了个奇怪的问题:为什么有最左匹配原则?

    其实我理解遇到这个问题有可能是面试官对前面的回答不是很满意,随口问了句这种话,毕竟这种话问出来有点为难的意思。

    然后我们拿这个问题来讨论下,真是八仙过海,谁都有谁的答案,谁都不服谁。也许这就是程序员吧。

    下面是我的个人理解,如果读者有更好的想法,欢迎回复加入讨论。

B+树的结构

在这里插入图片描述

    从上面可以看出来B+树的索引结构。

    其实根节点只存建索引的数据段。真正的data都放在叶子结点,那么叶子结点是存放所有数据的,这样方面范围扫描。

答案

    那么思考个问题:为什么有最左匹配原则?

    我的一句话答案是:算法+使用者约定。

     算法: mysql的匹配算法个人了解分为两种情况:数字类型,字符串类型。数字类型是直接比较可以匹配,字符串类型是从左到右逐个比较字符的,字符串从算法上就需要遵循最左匹配原则了。所以上面的例子我用下面这个语句也能走索引:

Where name like 'Bi%' and age = 30 and posistion='dev'

    另外提一点:另外B+树的时间复杂度是O(logn),对于叶子结点来说使用的是二分查找法。我理解如果我们是先二分查找一层数据,找到这个范围再查找第二层数据,再查找第三层数据。所以如果我们复合索引建的字段越多,查找的时间越长。比如上面的符合索引有三个数据,那么具体的时间复杂度是O(3logn),当然这个最后归为O(logn)时间复杂度。这告诉我们复合索引不是字段越多越好。

     使用者约定: maven里面有句话,spring里面也有句话:约定大于配置。那么mysql和我们做好约定:使用索引得按照MySql这个配置来。

争议

    有同事说是复合索引是二级索引的原因。

    这里我不同意,二级使用如果需要的值在索引之中有的话,那么是不会再走一级索引。这个使用就不需要最左匹配原则了吗?

    另外看看这个东西对另外一样东西有没有影响,还可以使用替换的方法:如果我二级索引也存放了具体的数据(只是假设),那么是否需要最左前缀原则匹配呢?

    以上就是全部内容了,如果读者有更好的想法,欢迎加入讨论。(感觉同事的面试应该基本凉凉了)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在前端面试,项目中可能会遇到各种问题。其中一些常见的问题包括: - 兼容性问题:不同浏览器对于某些CSS属性或JS方法的支持可能存在差异,导致页面在不同浏览器上显示效果不一致。 - 性能问题:页面加载速度慢、渲染迟缓等问题都会影响用户的体验。 - 响应式设计问题:在不同设备上展示页面,可能会出现布局错乱、字体大小不合适等问题。 - 数据交互问题:与后端接口对接,可能会出现数据格式不一致、请求超问题。 - 页面安全性问题:如XSS(跨站脚本攻击)、CSRF(跨站请求伪造)等安全漏洞可能会对页面造成影响。 解决这些问题的方法和技巧有很多,以下是一些常用的方法: - 使用CSS预处理器(如Less、Sass)来简化样式的编写,并提供一些方便的功能(如变量、嵌套、混合等)。 - 使用代码压缩工具(如UglifyJS、CSSNano)来压缩JS和CSS文件,以减少文件大小和网络传输间。 - 使用缓存策略(如HTTP缓存、LocalStorage)来提高页面加载速度和用户体验。 - 使用性能分析工具(如Google PageSpeed Insights、Lighthouse)来评估和改进页面的性能。 - 使用响应式设计框架(如Bootstrap、Foundation)来简化响应式设计的开发过程,并提供一致的用户体验。 - 使用安全性工具(如CSP、X-XSS-Protection)来防止页面受到恶意攻击。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值