MyException - 我的异常网
当前位置:我的异常网» 数据库 » 面试技巧,怎么通过索引说数据库优化能力,内容来自J

面试技巧,怎么通过索引说数据库优化能力,内容来自Java web轻量级开发面试教程

www.MyException.Cn  网友分享于:2013-10-27  浏览:0次
面试技巧,如何通过索引说数据库优化能力,内容来自Java web轻量级开发面试教程

      上星期写了一个篇文章,数据库方面的面试技巧,如何从建表方面展示自己能力,承蒙管理员抬举,放入首页,也承蒙各位厚爱,两天内收获了将近770个点击,也一度进入48小时热榜。

      为了感谢管理员和大家的支持,再根据我的面试经验原创一篇关于索引方面如何推销自己的文章。这内容也来自我写的书

java web轻量级开发面试教程

 

       如果我们需要招个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年以下的候选人是有帮助的。

 

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

 

7楼者也
select name from 学生成绩表 where 成绩gt;95 不走索引 ,这个是错误的吧。如果是建btree索引的话,是会走索引的,它就是干这个事的。如果建hash索引的话,不会走。
6楼kirkvicent
字段的数据类型和查询时使用的数据类型不一致,也会导致不走索引。这个坑比较隐蔽
Re: hsm_computer
@kirkvicent,,说的很对,谢谢补充。
5楼Jason.Ma
刚从DBA那里学了一招,对随机内容的字符串类型的字段做索引,查询效率也会变低。最好是对数字类型建索引。
4楼者也
select name from 学生成绩表 where 成绩gt;95 只是如果全表扫描比走索引快,就不走索引而已。
3楼崔宏宇_chy
mark
2楼东方不输
辛苦楼主了~
1楼TBHacker
楼主大大好流弊

文章评论

如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
那些争议最大的编程观点
那些争议最大的编程观点
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
我的丈夫是个程序员
我的丈夫是个程序员
Google伦敦新总部 犹如星级庄园
Google伦敦新总部 犹如星级庄园
为什么程序员都是夜猫子
为什么程序员都是夜猫子
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
一个程序员的时间管理
一个程序员的时间管理
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
漫画:程序员的工作
漫画:程序员的工作
总结2014中国互联网十大段子
总结2014中国互联网十大段子
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
Java程序员必看电影
Java程序员必看电影
每天工作4小时的程序员
每天工作4小时的程序员
程序员的鄙视链
程序员的鄙视链
鲜为人知的编程真相
鲜为人知的编程真相
程序员和编码员之间的区别
程序员和编码员之间的区别
我是如何打败拖延症的
我是如何打败拖延症的
程序员应该关注的一些事儿
程序员应该关注的一些事儿
老程序员的下场
老程序员的下场
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
2013年中国软件开发者薪资调查报告
2013年中国软件开发者薪资调查报告
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
中美印日四国程序员比较
中美印日四国程序员比较
编程语言是女人
编程语言是女人
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
2013年美国开发者薪资调查报告
2013年美国开发者薪资调查报告
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
10个调试和排错的小建议
10个调试和排错的小建议
如何成为一名黑客
如何成为一名黑客
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
程序员必看的十大电影
程序员必看的十大电影
 程序员的样子
程序员的样子
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有