web前端开发官网,JavaScript的变量与字面量

表中 t_user 值分别为(1,张一)、(2,张二)、(3,张三)、(4,张四)、(5,张五)

表结构如下:

mysql> create table t_user (

id bigint(20) not null auto_increment ,

name varchar(255) not null,

primary key (id),

index index_name (name) using btree)

engine=innodb

default character set=utf8 collate=utf8_general_ci

两棵树的示例示意图如下:

从图中不难看出,根据叶子节点的内容,索引类型分为主键索引和二级索引(非主键索引)。

主键索引: 主键索引的叶子节点保存着主键即对应行的全部数据。在InnoDB里,主键索引也被称为聚簇索引(clustered index)。

二级索引(非主键索引): 二级索引树中的叶子结点保存着索引值和主键值,当使用二级索引进行查询时,需要进行回表操作。在InnoDB里,非主键索引也被称为二级索引(secondary index)

通过上面所讲的,我们来看看如何通过sql语句来区分 主键索引和普通索引的查询

  • select * from t_user where id=1 即主键查询方式,则只需要搜索id这棵B+树

  • select * from t_user where name=张三 即普通索引查询方式,则需要先搜索name索引树,得到id的值为3,再到id索引树搜索一次。这个过程称为回表

也就是说,基于二级索引(非主键索引)的查询需要多扫描一棵索引树。因此,我们在应用中应该尽量使用主键查询。

看到这里如果你看懂了上面的介绍,那么这里你会有一个疑问,我直接用in id不就好了吗,建立id主键索引,就可以不用回表了,速度不也就提升了吗?

如果是 5.5 之前的版本确实不会走索引的,在 5.5 之后的版本,MySQL 做了优化。MySQL 在 2010 年发布 5.5 版本中,优化器对 in 操作符可以自动完成优化,针对建立了索引的列可以使用索引,没有索引的列还是会走全表扫描,也就是我们所说的回表。

那么,有没有可能经过索引优化,避免回表过程呢?答应是有的

四、覆盖索引


sql语句如下,其中id自增,name为索引:

mysql> create table t_user (

id bigint(20) not null auto_increment ,

name varchar(255) not null,

password varchar(255) ,

primary key (id),

engine=innodb

default character set=utf8 collate=utf8_general_ci

比如有这么两句sql

语句A: select id from user_table where name= '张三'

语句B: select password from user_table where name= '张三'

语句A: 因为 name索引树 的叶子结点上保存有 name和id的值 ,所以通过 name索引树 查找到id后,因此可以直接提供查询结果,不需要回表,也就是说,在这个查询里面,索引name 已经 “覆盖了” 我们的查询需求,我们称为 覆盖索引

语句B: name索引树 上 找到 name=‘张三’ 对应的主键id, 通过回表在主键索引树上找到满足条件的数据

因此我们可以得知,当sql语句的所求查询字段(select列)和查询条件字段(where子句)全都包含在一个索引中(联合索引),可以直接使用索引查询而不需要回表。这就是覆盖索引

例如上面的语句B是一个高频查询的语句,我们可以建立(name,password)的联合索引,这样,查询的时候就不需要再去回表操作了,可以提高查询效率。

所以关于上面的面试题我们就可以得出,使用联合索引就可以很好的回答面试官的问题(id,name,password)这样的联合索引就可以调用到覆盖索引,可以减少树的搜索次数,不再需要回表查整行记录,显著提升查询性能,所以使用覆盖索引是一个常用的性能优化手段。

说到了联合索引我们就不得不说联合索引中最重要的匹配原则,最左匹配原则了

五、最左匹配原则


最左前缀匹配原则,是非常重要的原则,mysql会从左向右进行匹配。

例如我们定义了(name,password)两个联合索引字段,我们 使用 where name = '张三' and password = '2'索引可以生效的,当我们是颠倒了他们的顺序 使用where password = '1' and name = '王五',索引同样也是可以生效的,在mysql查询优化器会判断纠正这条sql语句该以什么样的顺序执行效率最高,最后才生成真正的执行计划,我们能尽量的利用到索引时的查询顺序效率最高,所以mysql查询优化器会最终以这种顺序(where name = '张三' and password = '2')进行查询执行,就类似 我们的 order by name,password这样一种排序规则,先对张三的用户进行查询排序,在对password进行处理

比如我们要查询姓张的用户,我们的条件查询可以为 "where name like ‘张%’",但是不能是 where name like '%张%'或者是 where name like '%张',因为索引可以用于查询条件字段为索引字段,根据字段值必须是最左若干个字符进行的模糊查询,也就是需要是 ‘张%’ 这样的添加才可以使用。

索引的复用能力。因为可以支持最左前缀,所以当已经有了(name,password)这个联合索引后,一般就不需要单独在name上建立索引了。因此,第一原则是,如果通过调整顺序,可以少维护一个索引,那么这个顺序往往就是需要优先考虑采用的。

如果既有联合查询,又有基于name,password各自的查询呢?查询条件里面只有password的语句,是无法使用(name,password)这个联合索引的,这时候你需要同时维护(name,password)、(password) 这两个索引。

创建索引时,我们也要考虑空间代价,使用较少的空间来创建索引

假设我们现在不需要通过name查询password了,需要通过name查询age或通过age查询name

  • 1.(name,age)联合索引+age单字段索引

  • 2.(age,name)联合索引+name单字段索引

name字段是比age字段大的,所以,选择第一种,索引占用空间较小的一个

六、索引下推


上面我们说到满足最左前缀原则的时候,最左前缀可以用于在索引中定位记录。那么如果那些不符合最左前缀的部分,会怎么样呢?

如果现在有一个需求:检索出表中“名字第一个字是张,而且没有删除的信息(is_del = 1)。SQL语句如下:

mysql> select * from t_user where name like ‘张%’ and is_del=1

在MySQL 5.6之前,只能从匹配的位置一个个回表。到主键索引上找出数据行,再对比字段值

最后


分享一套我整理的面试干货,这份文档结合了我多年的面试官经验,站在面试官的角度来告诉你,面试官提的那些问题他最想听到你给他的回答是什么,分享出来帮助那些对前途感到迷茫的朋友。

面试经验技巧篇
  • 经验技巧1 如何巧妙地回答面试官的问题

  • 经验技巧2 如何回答技术性的问题

  • 经验技巧3 如何回答非技术性问题

  • 经验技巧4 如何回答快速估算类问题

  • 经验技巧5 如何回答算法设计问题

  • 经验技巧6 如何回答系统设计题

  • 经验技巧7 如何解决求职中的时间冲突问题

  • 经验技巧8 如果面试问题曾经遇见过,是否要告知面试官

  • 经验技巧9 在被企业拒绝后是否可以再申请

  • 经验技巧10 如何应对自己不会回答的问题

  • 经验技巧11 如何应对面试官的“激将法”语言

  • 经验技巧12 如何处理与面试官持不同观点这个问题

  • 经验技巧13 什么是职场暗语

面试真题篇

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!**

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 15
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值