索引是数据库优化所必需的工具,在面试的时候一般不会问概念性的问题,会问什么问题又如何回答呢?请看下文。

  如果我们需要招个Java方面的高级程序员,一方面看年限(本科3年),具体到数据库方面的技能要求,包括如下三个方面:

  第一,是否会基本的增删改查,存储过程等技能,是否会用些groupby,having,distinct,exist,in,with等高级点的语句。这点一般都没问题,甚至一个刚毕业的大学生或工作经验2年之内的初级程序员也没问题,也就是说,这个是高级程序员必备的,你会了是应该,不会甚至不及毕业生。

  第二,有没有设计表的经验,这方面的面试技能也已经在数据库方面的面试技巧,如何从建表方面展示自己能力里说了,关键一点,你得结合实际需求来说。

  第三也是关键一点,在数据库优化方面,你是否有相关经验。

  这是个开放性的问题,大神们知道,可以从分区,根据执行计划优化等很多方面来考虑,对高级程序员,我的期望是你至少能说点索引相关的。但根据我的面试经验,很少有候选人(特别是高级程序员候选人)能比较深入地叙述。

  开场白说了不少,下面进入正文。

  索引是数据库优化所必需的工具,在面试的时候一般不会问概念性的问题,因为大家都能从教科书上找到答案,所以一般会问以下两方面的问题:

  ①索引有什么代价?哪些场景下你需要建索引?或者有时候反过来问,哪些场景下不推荐建索引。

  ②建好索引之后,怎么才能最高效地利用索引?或者反过来问,请说出一个无法有效利用已建索引的案例。

  从结构上来看,索引好比是一棵B树(也叫B*或者B+),假设学生表里只有学生ID和姓名两列,该学生表里有1000个学生,学号分别从1到1000,如果针对ID建立索引,大致的结构如下图所示。

  当然,在实际的数据库系统中,索引要比这个复杂得多,但从这个图里,我们能大致看出索引的工作原理。
索引建好后,如果我们要查找ID为111的学生,则数据库系统就会走索引,从图2.1中我们可以看到,根据根节点的指引,会找到第二层从左往右第二个数据块,以此类推,会在第四层里得到ID为111的物理地址,然后直接从硬盘里找数据。

  反过来,如果没有建索引,数据库系统可能就要从一个大的范围里逐一定位查找,效率就没这么高了。

  索引的好处大家已经看到了,那么为了得到这个“查询效率高”的好处,我们要付出了什么样的代价呢?

  1索引需要占硬盘空间,这是空间方面的代价。

  2一旦插入新的数据,就需要重新建索引,这是时间上的代价。

  关于索引性能问题,我会细问,你建索引的表规模多少?不少人直接告诉我表就几千条,我或者问,索引有什么代价?不少回答是索引是只有好处没坏处的,也就是说,可以随便建。

  对此我们来详细分析下(也就是大家在面试时需要说的):

  场景一,数据表规模不大,就几千行,即使不建索引,查询语句的返回时间也不长,这时建索引的意义就不大。当然,若就几千行,索引所占的空间也不多,所以这种情况下,顶多属于“性价比”不高。

  场景二,某个商品表里有几百万条商品信息,同时每天会在一个时间点,往其中更新大概十万条左右的商品信息,现在用where语句查询特定商品时(比如wherename=‘XXX’)速度很慢。为了提升查询效率可以建索引,但当每天更新数据时,又会重建索引,这是要耗费时间的。这时就需要综合考虑,甚至可以在更新前删除索引,更新后再重建。

  场景三,从上图中可以看到,因为在数据表里ID值都不相同,所以索引能发挥出比较大的作用。相反,如果某个字段重复率很高,如性别字段,或者某个字段大多数值是空(null),那么不建议对该字段建索引。

  请大家记住,一定是有业务需求了才会建索引。比如在一个商品表里,我们经常要根据name做查询,如果没有索引,查询速度会很慢,这时就需要建索引。但在项目开发中,如果不经常根据商品编号查询,那么就没必要对编号建索引。

  最后再强调一次,建索引是要付出代价的,没事别乱建着玩,同时在一个表上也不能建太多的索引。

  下面说下索引建好了该怎么用?毕竟大家花了不少时间和空间代价建了索引,至少得回本吧?

  如果出现一些不好的SQL语句,那么索引就白建了。下面通过一些具体的例子来看索引的正确用法。

  ①语句一:selectnamefrom商品表。不会用到索引,因为没有where语句。

  ②语句二:select*from商品表wherename=‘Java书’,会用到索引,如果项目里经常用到name来查询,且商品表的数据量很大,而name值的重复率又不高,那么建议建索引。

  ③语句三:select*from商品表wherenamelike‘Java%’这是个模糊查询,会用到索引,请大家记住,用like进行模糊查询时,如果第一个就是模糊的匹配符,比如wherenamelike‘%java’,那么在查询时不会走索引。在其他情况下,不论用了多少个%,也不论%的位置,只要不出现在第一个位置,那么都能用到索引。

  学生成绩表里有两个字段:姓名和成绩。现在对成绩这个整数类型的字段建索引。

  ①第一种情况,当数字型字段遇到非等值操作符时,无法用到索引。比如:
selectnamefrom学生成绩表where成绩>95,一旦出现大于符号,就不能用到索引,为了用到索引,我们应该改一下SQL语句里的where从句:where成绩in(96,97,98,99,100)

  ②第二种情况,如果对索引字段进行了某种左值操作,那么无法用到索引。

  能用到索引的写法:selectnamefrom学生成绩表where成绩=60

  不能用到索引的写法:selectnamefrom学生成绩表where成绩+40=100

  ③第三种情况,如果对索引字段进行了函数操作,那么无法用到索引。

  比如SQL语句:select*from商品表wheresubstr(name)=‘J’,我们希望查询商品名首字母是J的记录,可一旦针对name使用函数,即使name字段上有索引,也无法用到。

  关于索引,当然还有位图索引和复合索引等,如果大家要应聘更高级的岗位(比如有5年经验了),那么就不能止步于此了,但根据我的面试经验,上述关于索引的说辞对工作经验3年以下的候选人是有帮助的。

  其实我知道,不少程序员平时用过索引,但不知道怎么说,这很吃亏。对于高级程序员而言,如果你这都说不好,那么你的能力比初级的要高多少?对于初级程序员而言,如果你掌握了,而且能在面试中很好地说,那么你和同等能力的人相比,就很占优势。

  本文选自《Java Web轻量级开发面试教程》,点此链接可在博文视点官网查看此书。
                 
想及时获得更多精彩文章,可在微信中搜索“博文视点”或者扫描下方二维码并关注。
                    

面试技巧,如何通过索引说数据库优化能力相关推荐

  1. 如何通过索引说数据库优化能力

    索引是数据库优化所必需的工具,在面试的时候一般不会问概念性的问题,会问什么问题又如何回答呢?请看下文. 如果我们需要招个Java方面的高级程序员,一方面看年限(本科3年),具体到数据库方面的技能要求, ...

  2. 面试官:你来谈谈数据库优化的几个阶段?

    作者:孤独烟,资深后端工程师,业内知名原创作者! 引言 大家在面试的时候,是否遭遇过,面试官询问 你们是如何进行数据库优化的? 那这个问题应该怎么答呢?其实写这个题材的原因是我这几天看到各公众号转的一 ...

  3. 数据库优化三部曲(2)-读写分离-一蓑烟雨任平生

    前言 上篇文章介绍了MySql的主从复制,读写分离就不写了,毕竟MySql比Oracle简单太多了(自我感觉),这篇主要写一下Oracle的读写分离,照葫芦画瓢,会了Oracle的读写分离,那么MyS ...

  4. MySQL索引,SQL优化一网打尽

    2-3W字长文警告!!!! 索引概述 MySQL官方对索引的定义为:索引(index)是帮助MySQL高效获取数据的数据结构(有序).在数据之外,数据库系统还维护者满足特定查找算法的数据结构,这些数据 ...

  5. 数据库优化一般思路(个人经验之谈)

    随着系统规模的不断增加,数据量和并发量不断增大,整个系统架构中最先受到冲击而形成瓶颈的,定然是数据库,因此数据库层面的优化,是一个程序员不可或缺的技能,以下是我在使用数据库中的一些心得,有不足之处,还 ...

  6. 面试技巧(4)面试技巧和注意事项

    有些刚要参加面试的朋友不禁的要问,最实用的面试技巧,最能见效的面试技巧有哪些么,我告诉你把,最实用的面试技巧是你平时努力.专业能力以及个人的素质所决定,当然也不否认临场发挥的问题.如果你平时都非常优秀 ...

  7. MySQL数据库优化的几种方式(笔面试必问)

    作者平台: | CSDN:blog.csdn.net/qq_4115394- | 掘金:juejin.cn/user/651387- | 知乎:www.zhihu.com/people/1024- | ...

  8. 高并发之存储篇:关注下索引原理和优化吧!躲得过实践,躲不过面试官!

    以MySQL的InnoDB索引为主,看完需要5分钟 本文内容预览: 为什么Kafka不需要我们关心索引,而Mysql却需要? Mysql数据怎么被组织 2.1 数据记录最小单位:行 2.2 与磁盘最小 ...

  9. 数据库优化实例以及优化的小技巧

    SQL Server上面删除1.6亿条记录,不能用Truncate(因为只是删除其中少部分数据). 经过实验,每次删除400万条要花1.5 - 3小时,而且是越到后面越慢,正常的话,需要大约102个小 ...

  10. mysql数据库优化大全_MySQL数据库优化技巧大全

    简介: MySQL数据库优化技巧大全 MySQL优化三大方向 ① 优化MySQL所在服务器内核(此优化一般由运维人员完成). ② 对MySQL配置参数进行优化(my.cnf)此优化需要进行压力测试来进 ...

最新文章

  1. 面试官:能说一说Mysql缓存池吗?
  2. python查看工作目录_闲话python-36:文件系统操作
  3. 学python找什么工作-学Python能找到什么工作?这4种工作最热门!
  4. LeetCode每日一题 143. 重排链表
  5. 详解Django-auth-ldap 配置方法
  6. 绿屏后再现“粉屏”门!大量网友投诉iPhone 13粉屏问题 客服:非硬件问题
  7. TaskService API
  8. iOS之 随笔Xcode7的lipo
  9. MapXtreme 2005 学习心得 第八节Session问题澄清-两种配置方式致开发方式不同(九)...
  10. 高T技术大牛的百度十年:白天求生存,晚上求发展
  11. (附源码)php初中历史专题教学网站 毕业设计 100623
  12. ping/tracert/telnet
  13. 手机qq怎么添加相册表情包_手机qq怎么制作表情包配文字
  14. linux sed命令
  15. 编码人大脑的5大小吃
  16. python seo 相关的库_11个并不被常用但对开发非常有帮助的Python库
  17. 一连串数字怎么转换成二维码?数字生成二维码如何制作?
  18. 工作 10 年后,我突然决定读硕士了!
  19. 局域网socket传输视频流
  20. 马尔科夫预测MATLAB

热门文章

  1. spring 事务传播行为类型
  2. maven的安装配置超详细教程【含nexus】
  3. spring 容器的理论知识
  4. 读书笔记:《知道做到》
  5. js模拟java的spring
  6. WPF依赖属性(续)(4)依赖属性与数据绑定
  7. ArcGIS API For JS实现动态点扩散
  8. Python-Matplotlib 12 多图figure
  9. 数据类型 swift
  10. mysql索引操作(转)