面试技巧,如何通过索引说数据库优化能力,内容来自Java web轻量级开发面试教程
上星期写了一个篇文章,数据库方面的面试技巧,如何从建表方面展示自己能力,承蒙管理员抬举,放入首页,也承蒙各位厚爱,两天内收获了将近770个点击,也一度进入48小时热榜。
为了感谢管理员和大家的支持,再根据我的面试经验原创一篇关于索引方面如何推销自己的文章。这内容也来自我写的书
如果我们需要招个Java方面的高级程序员,一方面看年限(本科3年),具体到数据库方面的技能要求,包括如下三个方面:
第一,是否会基本的增删改查,存储过程等技能,是否会用些group by, having,distinct, exist, in, with等高级点的语句。这点一般都没问题,甚至一个刚毕业的大学生或工作经验2年之内的初级程序员也没问题,也就是说,这个是高级程序员必备的,你会了是应该,不会甚至不及毕业生。
第二,有没有设计表的经验,这方面的面试技能也已经在数据库方面的面试技巧,如何从建表方面展示自己能力里说了,关键一点,你得结合实际需求来说。
第三也是关键一点,在数据库优化方面,你是否有相关经验。
这是个开放性的问题,大神们知道,可以从分区,根据执行计划优化等很多方面来考虑,对高级程序员,我的期望是你至少能说点索引相关的。但根据我的面试经验,很少有候选人(特别是高级程序员候选人)能比较深入地叙述。
开场白说了不少,下面进入正文。
索引是数据库优化所必需的工具,在面试的时候一般不会问概念性的问题,因为大家都能从教科书上找到答案,所以一般会问以下两方面的问题:
①索引有什么代价?哪些场景下你需要建索引?或者有时候反过来问,哪些场景下不推荐建索引。
②建好索引之后,怎么才能最高效地利用索引?或者反过来问,请说出一个无法有效利用已建索引的案例。
从结构上来看,索引好比是一棵B树(也叫B*或者B+),假设学生表里只有学生ID和姓名两列,该学生表里有1000个学生,学号分别从1到1000,如果针对ID建立索引,大致的结构如下图所示。
当然,在实际的数据库系统中,索引要比这个复杂得多,但从这个图里,我们能大致看出索引的工作原理。
索引建好后,如果我们要查找ID为111的学生,则数据库系统就会走索引,从图2.1中我们可以看到,根据根节点的指引,会 找到第二层从左往右第二个数据块,以此类推,会在第四层里得到ID为111的物理地址,然后直接从硬盘里找数据。
反过来,如果没有建索引,数据库系统可能就要从一个大的范围里逐一定位查找,效率就没这么高了。
索引的好处大家已经看到了,那么为了得到这个“查询效率高”的好处,我们要付出了什么样的代价呢?
1 索引需要占硬盘空间,这是空间方面的代价。
2 一旦插入新的数据,就需要重新建索引,这是时间上的代价。
关于索引性能问题,我会细问,你建索引的表规模多少?不少人直接告诉我表就几千条,我或者问,索引有什么代价?不少回答是索引是只有好处没坏处的, 也就是说,可以随便建。
对此我们来详细分析下(也就是大家在面试时需要说的):
场景一,数据表规模不大,就几千行,即使不建索引,查询语句的返回时间也不长,这时建索引的意义就不大。当然,若就几千行,索引所占的空间也不多,所以这种情况下,顶多属于“性价比”不高。
场景二,某个商品表里有几百万条商品信息,同时每天会在一个时间点,往其中更新大概十万条左右的商品信息,现在用where语句查询特定商品时(比如where name = ‘XXX’)速度很慢。为了提升查询效率可以建索引,但当每天更新数据时,又会重建索引,这是要耗费时间的。这时就需要综合考虑,甚至可以在更新前删除索引,更新后再重建。
场景三,从上图中可以看到,因为在数据表里ID值都不相同,所以索引能发挥出比较大的作用。相反,如果某个字段重复率很高,如性别字段,或者某个字段大多数值是空(null),那么不建议对该字段建索引。
请大家记住,一定是有业务需求了才会建索引。比如在一个商品表里,我们经常要根据name做查询,如果没有索引,查询速度会很慢,这时就需要建索引。但在项目开发中,如果不经常根据商品编号查询,那么就没必要对编号建索引。
最后再强调一次,建索引是要付出代价的,没事别乱建着玩,同时在一个表上也不能建太多的索引。
下面说下索引建好了该怎么用?毕竟大家花了不少时间和空间代价建了索引,至少得回本吧?
如果出现一些不好的SQL语句,那么索引就白建了。下面通过一些具体的例子来看索引的正确用法。
①语句一:select name from 商品表。不会用到索引,因为没有where语句。
②语句二:select * from 商品表 where name = ‘Java书’,会用到索引,如果项目里经常用到name来查询,且商品表的数据量很大,而name值的重复率又不高,那么建议建索引。
③语句三:select * from 商品表 where name like ‘Java%’ 这是个模糊查询,会用到索引,请大家记住,用like进行模糊查询时,如果第一个就是模糊的匹配符,比如where name like ‘%java’,那么在查询时不会走索引。在其他情况下,不论用了多少个%,也不论%的位置,只要不出现在第一个位置,那么都能用到索引。
学生成绩表里有两个字段:姓名和成绩。现在对成绩这个整数类型的字段建索引。
①第一种情况,当数字型字段遇到非等值操作符时,无法用到索引。比如:
select name from 学生成绩表 where 成绩>95 , 一旦出现大于符号,就不能用到索引,为了用到索引,我们应该改一下SQL语句里的where从句:where 成绩 in (96,97,98,99,100)
② 第二种情况,如果对索引字段进行了某种左值操作,那么无法用到索引。
能用到索引的写法:select name from 学生成绩表 where 成绩 = 60
不能用到索引的写法:select name from 学生成绩表 where 成绩+40 = 100
③ 第三种情况,如果对索引字段进行了函数操作,那么无法用到索引。
比如SQL语句:select * from 商品表 where substr(name) = ‘J’,我们希望查询商品名首字母是J的记录,可一旦针对name使用函数,即使name字段上有索引,也无法用到。
关于索引,当然还有位图索引和复合索引等,如果大家要应聘更高级的岗位(比如有5年经验了),那么就不能止步于此了,但根据我的面试经验,上述关于索引的说辞对工作经验3年以下的候选人是有帮助的。
其实我知道,不少程序员平时用过索引,但不知道怎么说,这很吃亏。对于高级程序员而言,如果你这都说不好,那么你的能力比初级的要高多少?对于初级程序员而言,如果你掌握了,而且能在面试中很好地说,那么你和同等能力的人相比,就很占优势。
面试技巧,如何通过索引说数据库优化能力,内容来自Java web轻量级开发面试教程的更多相关文章
- (java web后端方向)如何让你的简历为你争取到更多的面试机会,内容来自java web轻量级开发面试教程
我们在做培训时,会发现一个不合理的情况,一些程序员能力不错,在公司里也是技术牛人,但发出去的简历往往会石沉大海,没有回复.对于刚毕业的大学生或工作年限在2年之内的程序员,这个情况会更严重. 这种情况下 ...
- 面试时,当你有权提问时,别客气,这是个逆转的好机会(内容摘自Java Web轻量级开发面试教程)
前些天,我在博客园里写了篇文章,如何在面试中介绍自己的项目经验,收获了2千多个点击,这无疑鼓舞了我继续分享的热情,今天我来分享另外一个面试中的甚至可以帮助大家逆转的技巧,本文来是从 java web轻 ...
- 根据实践经验,讲述些学习Java web能少走的弯路,内容摘自java web轻量级开发面试教程
在和不少比较上进的初级程序员打交道的过程中,我们总结出了一些能帮到合格程序员尽快进阶的经验,从总体上来讲,多学.多实践不吃亏.本文来是从 java web轻量级开发面试教程从摘录的. 1 哪些知识点 ...
- Hibernate(或其它ORM)里的inverse用法详解,内容摘自Java web轻量级开发面试教程
本文来是从 java web轻量级开发面试教程从摘录的. Inverse的英文含义是反转,在Hibernate中用来决定是由哪方来维护两个业务实体类之间的关联关系,具体而言,就是由哪方去设置这个被外键 ...
- 数据库面试技巧,通过JDBC展示自己专业性,摘自java web轻量级开发面试教程
这篇文章是我之前写的博文 数据库方面的面试技巧,如何从建表方面展示自己能力 和 面试技巧,如何通过索引说数据库优化能力,内容来自Java web轻量级开发面试教程是一个系列的,通过面试官的视角和大家分 ...
- java web轻量级开发面试教程摘录,java web面试技巧汇总,如何准备Spring MVC方面的面试
本内容摘自 java web轻量级开发面试教程 https://baike.baidu.com/item/Java%20Web%E8%BD%BB%E9%87%8F%E7%BA%A7%E5%BC%80% ...
- java 面试,如何提升自己的实力,摘自 java web轻量级开发面试教程
本内容摘自 java web轻量级开发面试教程 其中有一段讲述到了实习经验对找工作的帮助 1.2.2大学阶段的实习经验能帮到你 一般公司在筛选简历时,一个非常重要考察的要点是相关经验的工作年限,说一个 ...
- java web面试技巧,数据库面试,java web轻量级开发面试教程
我最近看到一本比较好的讲java web方面面试的书,java web轻量级开发面试教程. 其中不仅用案例和视频讲述了Spring MVC,Hibernate, ORM等方面的技巧,而且还实际讲到了面 ...
- Java web轻量级开发面试教程读书笔记:数据库方面,如何准备面试
如果在面试或与资深人事交流的过程中,你能有效合理地展示出本章所给出的一些知识点,那么对你的评价就会是"对数据库有深入了解",甚至能加上"有设计数据表的经验",即 ...
随机推荐
- 基于.NET CORE微服务框架 -谈谈surging的服务容错降级
一.前言 对于不久开源的surging受到不少.net同学的青睐,也受到.net core学习小组的关注,邀请加入.NET China Foundation以方便国内.net core开源项目的推广, ...
- 个人作业2--英语学习APP案例分析
1.下载APP并使用,上手体验 个人很喜欢这种风格,画面简洁,排版精细,尤其是联想词的界面,很惊喜.但是很多链接比如精选文章点进去之后的UI设计并不理想,感觉只是一个网页而已.并且我不能够保存或者收藏 ...
- (转)spring学习之@ModelAttribute运用详解
@ModelAttribute使用详解 1 @ModelAttribute注释方法 例子(1),(2),(3)类似,被@ModelAttribute注释的方法会在此controller每个方法执行前被 ...
- ubuntu上安装apache2+mysql+php5-fpm(PHP5 - FastCGI Process Manager)
1: 安装mysql apt-get install mysql-server mysql-client 安装过程中会被问到设置mysql root的密码 New password for t ...
- MySQL_第三方数据库引擎_tokudb
前阵子迁移zabbix到tokudb,整理部分操作笔记到这篇博文. 如果转载,请注明博文来源: www.cnblogs.com/xinysu/ ,版权归 博客园 苏家小萝卜 所有.望各 ...
- js中this的指向总结
// this要在执行时才能确认值,定义时无法确认.下面是常见的几种this指向. //1.在构造函数执行 function Obj(name,age){ //1.实例化时:会创建一个 空对象 ...
- ThinkPHP5.0相关
1.tp5的下载安装 使用git克隆下面的仓库地址,这个地址下载的速度比较快,差不多两分钟的时间. 克隆tp5的应用项目: git clone https://github.com/top-think ...
- Python 协程总结
Python 协程总结 理解 协程,又称为微线程,看上去像是子程序,但是它和子程序又不太一样,它在执行的过程中,可以在中断当前的子程序后去执行别的子程序,再返回来执行之前的子程序,但是它的相关信息还是 ...
- Luogu P3367 【模板】并查集
题目描述 如题,现在有一个并查集,你需要完成合并和查询操作. 输入输出格式 输入格式: 第一行包含两个整数N.M,表示共有N个元素和M个操作. 接下来M行,每行包含三个整数Zi.Xi.Yi 当Zi=1 ...
- CSS规范--春风十里不如写好CSS
先吟几句: 最近看了看春风十里不如你,本来很少看剧的,暑假有点闲就看了,感觉不错,挺喜欢这部剧,就套了个名字,嘿嘿嘿.剧里面印象深刻的是<致橡树>这首诗,念几句: 我如果爱你,绝不像攀援的 ...