范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

面试三轮我倒在了一道sql题上sql性能优化

  一、前言
  最近小农在找工作,因为今年疫情的特殊原因,导致工作不是特别好找,所以一旦有面试电话,如果可以,都会去试一试,刚好接到一个面试邀请,感觉公司还不错,于是就确定了面试时间,准备了一下就去面试了。
  第一轮面试是小组组长面试,通过。第二轮是经理面试也是通过了。第三轮总监面试,前面都还有模有样,突然画风一转,面试官说:"问你最后一个问题"
  面试官:10W条数据,我要从其中查出100条不连续的数据,给你id,来查name和password进行展示,如何才能高性能的去使用?
  我:在id上建立聚簇索引,然后用 in id 来缩小表搜索范围,最后 使用条件查询 小于最大id,大于最小id,这样可以让sql速度能够比较快的展示,虽然In的性能比较低心里活动:雕虫小技,还最后一个问题,这样的问题再来一个吧
  只见面试官紧锁眉头,与我心里期待的表情有点不一样啊,难道是哪个环节出了问题?面试官:这样的性能不能达到最优化的程度,而且如果我给你的最小id是1,最大id是100000呢?
  你这就有点杠精了啊,那行吧,你是面试官你说了算我:既然id已经给出来了,而且只查询两个字段,用聚簇索引那么查询数据是很快的,用in id应该是可以的。
  面试官:好的,回去等通知吧我…二、后知
  于是回去后,查询资料,才知道原来面试官,真正想考的是 "覆盖索引"
  什么是覆盖索引:
  当sql语句的所求查询字段(select列)和查询条件字段(where子句)全都包含在一个索引中 (联合索引),可以直接使用索引查询而不需要回表。这就是覆盖索引,通过使用覆盖索引,可以减少搜索树的次数,这就是 覆盖索引,在了解覆盖索引之前,我们先来看看什么是索引。三、什么是索引?
  我们有一个主键列为id的表,表中有字段name,并且在name上有索引
  表中 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=innodbdefault 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=innodbdefault 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查询name1.(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之前,只能从匹配的位置一个个回表。到主键索引上找出数据行,再对比字段值
  在MySQL 5.6中 引入的索引下推优化(index condition pushdown), 可以在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数
  根据(username,is_del)联合索引查询所有满足名称以"张"开头的索引,然后回表查询出相应的全行数据,然后再筛选出未删除的用户数据。过程如下图:
  每一个虚线箭头表示回表一次图一(无索引下推执行流程)
  每一个虚线箭头表示回表一次图二(索引下推执行流程)
  图1跟图2的区别是,InnoDB在(name,is_del)索引内部就判断了数据是否逻辑删除,对于逻辑删除的记录,直接判断并跳过。在我们的这个例子中,只需要对ID1、ID4这两条记录回表取数据判断,就只需要回表2次
  mysql默认启用索引下推,我们也可以通过修改系统变量optimizer_switch的index_condition_pushdown标志来控制SET optimizer_switch = "index_condition_pushdown=off";
  我们也需要注意:innodb引擎的表,索引下推只能用于二级索引,因为innodb的主键索引树叶子结点上保存的是全行数据,所以这个时候索引下推并不会起到减少查询全行数据的效果索引下推一般可用于所求查询字段(select列)不是/不全是联合索引的字段,查询条件为多条件查询且查询条件子句(where/order by)字段全是联合索引六、小结
  今天的内容就到这里了,我们在上面描述了数据库索引的概念,包括了覆盖索引、联合索引、索引下推,那么下次如果有面试官问你刚开始的问题,相信大家可以好好的回(dui)答(ta)一下面试官了,在sql优化中,减少回表次数,或者直接使用覆盖索引是比较重要的,尽量少地访问资源也是数据库设计的重要原则之一,谢谢大家,加油~

什么?中国联通APP还能购物吗?中国联通APP焕新增添商城啦手机业务办理APP也能像网购软件一样购物,这样的APP你能想象到吗?中国联通APP实现了。商城模块是中国联通为用户提供智享生活而更新APP的一大亮点模块这里聚集了中国联通多款套餐号推动智慧助老,中国联通有这几项服务在2021年全国两会上,政府工作报告明确提出不能让智能工具给老年人日常生活造成障碍。针对老年用户,中国联通推出了孝心卡银龄卡及全国一家亲亲情付等业务套餐,帮助老年人获得更佳的通信体进化升级!中国联通APP焕新啦2021年4月6日,中国联通手机营业厅APP正式更名为中国联通APP。在服务用户十年之际,中国联通APP在外观服务生活娱乐财富五大方面迎来全新升级。新模式,新服务,中国联通在未来将财富密码哪里找?就在中国联通APP有朋友可能留意到,最近中国联通手机营业厅焕然一新,不仅APP标志换了,进入APP之后的页面也有了很大变化,这是因为中国联通APP正式焕新啦!在服务用户满十年这个特别的年份,中国联通老人推着自己种的菜县城售卖养儿防老是空话自力更生不拖累子女行走各地,都能看到很多老人拿着自己家里的各种农产品在街头售卖。他们东西不多,把当季的家里吃不完的都带上些,希望能卖点钱补充其它日用品。大娘推着自家种的各种菜还有柿子到县城售卖。大娘中国四大名玉之一蓝田玉万年以前开采利用74岁老人传承玉雕技艺蓝田玉是中国四大名玉之一,素有玉种蓝田之美称,是中国开发利用最早的玉种之一,早在万年以前的石器时代,蓝田玉就被先民们开采利用。陕西的蓝田县不仅因为玉石闻名全国,玉雕手艺也是陕西省非江湖游医治鼻息肉取完一边让老人回家拿钱再取另一边在市场看到围了一群人,也好奇过去看看,原来是一位江湖游医在给人看鼻子眼睛的病痛,周围都是一些老年人。这位游医给人看病先免费看一半,一只眼睛一个鼻孔,然后问带了多少钱,大部分老人都只联通智慧助老这些智能手机必备技能,你教爸妈了吗?据国家统计局发布的数据显示,2019年底,我国60周岁及以上的人口约有2。54亿人,占总人口的18。1,而在老年人群体中,使用智能手机上网的老年人仅有1。34亿户,全国超过1亿的老兆这样生活!联通三千兆,与你智慧同行和往常一样,小联晚上八点半打卡下班,踏着傍晚的夕阳,小联钻进了回家的最后一趟地铁。车厢内不时传来呼噜声,是对面坐着的那个上班族靠着座位睡着了他旁边的大爷刷着手机发出低沉的笑声车厢外69岁杨大爷西安南门外左右手写大字赢得掌声爱好者拍照回去临摹西安城墙永宁门外的一个商场前广场,一位大爷手持硕大的毛笔,蘸着清水在空地上写书法,大爷身边有许多人围观。这位写水字的大爷姓杨,今年69岁了,平日里酷爱书法,经常以广场上平整干净的地75岁老机械工人地铁站外弹月琴卖艺称日子宽裕也不会干这个西安一地铁站外,一位老人在弹月琴卖艺,老人已经75岁,退休前是一名机械工人。老人酷爱音乐,以前拉二胡,6年前开始学习月琴,手里的月琴已经用了6年,花了300元钱买的。老人讲跟专业人
华为Mate40系列现在什么价格,用过的人感觉有什么缺陷吗?价没降,缺陷配件贵,摔不起,没有了我是40,优惠900,但是要办个电信卡,139套餐,目前每个月返50话费券。充电快,续航给力,信号好,声音大,出差人的利器价格京东搜一下各种配置不强迫症患者的福利!高性价比耳机推荐上手HIKTI之后,整体感觉十分不错。比如它的LED数字显示,使每次打开耳机的充电仓盖,电量一目了然,这完全是强迫症患者的福音呀。HIKT1音质清晰,两个耳机同时使用,立体感十足,业内首发!中国芯再获突破,美院士感慨中国科学家不睡觉吗在西方人眼里,中国芯片比较落后,大量高尖端芯片不得不依赖进口,我们虽然不愿意接受这个结果,但这却是不争的事实。据公开资料显示,截止至2020年底,我国芯片自给率不足30,每年要从海狂打擦边球!交友软件明码标价?网友社会很单纯复杂的是人随着物质生活的日益丰富,人们开始追求更多的精神世界,交友软件也如雨后春笋般都冒了出来。如今人们更喜欢在网上隔着屏幕聊天,而不太愿意去选择线下交流。我们常用的微信QQ等都属于熟人间的当今社会手机达到人手一机,可为什么有的人还要戴手表?现在大家都是手机不离身,觉得手机很方便,还能随时了解时间。但是如果你的手机没电了呢?这时候你连现在几点都不知道。所以,即使身边有手机了,但是戴个手表还是很有必要的。现在戴表不光是看38岁阿里P9裸辞,回家带娃!认知水平的高度,决定你的人生高度K哥的一位朋友D总,辞去了阿里P9的工作,回家专职带娃。听到这个消息我是非常震惊的,毕竟能够做到阿里P9是非常不容易的,既有钱又有社会认同,这不就是打工人梦寐以求的吗?可是D总不这御银股份,苏宁易购,浙江建投,华润双鹤,爱仕达,完美世界华联股份是新零售概念。三孚股份是有机硅概念。金逸影视是影视院线概念。华润双鹤是化学制药概念。御银股份是区块链概念。顶点软件是软件开发概念。苏宁易购是网络直播概念。天佑德酒是白酒概念中签亏1。1万!峰岹科技1分钟暴跌25!毕磊心情如何?文杨万里如果你讨厌一个人,可以教他去申购新股,保证让你出气。看似一个段子,却反映了市场的无奈。4月20日,又一只科创板新股破发。N峰岹(峰岹科技)开盘1分钟破发,跌幅一度超过25,(科技)十年十倍!中国墨子号实现1200公里地表量子态传输新纪录新华社合肥5月6日电(记者徐海涛陈诺)记者5月6日从中国科学技术大学获悉,该校潘建伟院士及同事彭承志陈宇翱印娟等利用墨子号量子科学实验卫星,近期首次实现了地球上相距1200公里两个2022美国半导体行业现状(附中英文版报告)近日,美国半导体行业协会(SIA)发布了2022版美国半导体行业现状报告。这个报告分为五大部分,分别是行业概况全球市场(多元化和消费者驱动)资本和研发投资(保持美国半导体行业竞争力颠覆燃油车?小鹏G9曝光高压充电5分钟,续航增200KM今年以来小鹏汽车的销量很猛,旗下的新车销量大幅上升,所以小鹏汽车也经常被消费者所提起,也被称为最成功的造车新势力之一,旗下的小鹏P5,小鹏P7购买的消费者确实很多。但说实话,很多人