相关文章推荐
没有腹肌的松鼠  ·  【问诊2024中国经济】林毅夫:对近期中国发 ...·  8 月前    · 
果断的海豚  ·  新闻 | ...·  8 月前    · 
愉快的匕首  ·  RE6旅行者被雷电将军强吻_单机游戏热门视频·  9 月前    · 
听话的板栗  ·  张献龙:论文写在大地 ...·  1 年前    · 
失恋的橡皮擦  ·  惊悚片《拜访小屋》:剧情刺激感与娱乐性兼具, ...·  1 年前    · 
Code  ›  面试技巧,如何通过索引说数据库优化能力,内容来自Java web轻量级开发面试教程开发者社区
云数据库 索引 mysql索引 面试技巧
https://cloud.tencent.com/developer/article/1019491
淡定的小刀
1 年前
用户1153489
0 篇文章

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

前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
最新优惠活动
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
用户1153489
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
社区首页 > 专栏 > java架构学习交流 > 面试技巧,如何通过索引说数据库优化能力,内容来自Java web轻量级开发面试教程

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

作者头像
用户1153489
发布 于 2018-01-12 16:31:30
582 0
发布 于 2018-01-12 16:31:30
举报

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

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

本文参与 腾讯云自媒体分享计划 ,分享自作者个人站点/博客。
原始发表:2017-09-02 , 如有侵权请联系 cloudcommunity@tencent.com 删除
数据处理
java

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!

数据处理
java
评论
登录 后参与评论
0 条评论
热度
最新
登录 后参与评论
关于作者
用户1153489
0
文章
0
累计阅读量
0
获赞
前往专栏
领券
  • 社区

    • 专栏文章
    • 阅读清单
    • 互动问答
    • 技术沙龙
    • 技术视频
    • 团队主页
    • 腾讯云TI平台
  • 活动

    • 自媒体分享计划
    • 邀请作者入驻
    • 自荐上首页
    • 技术竞赛
  • 资源

    • 技术周刊
    • 社区标签
    • 开发者手册
    • 开发者实验室
  • 关于

    • 社区规范
    • 免责声明
    • 联系我们
    • 友情链接

腾讯云开发者

扫码关注腾讯云开发者

扫码关注腾讯云开发者

领取腾讯云代金券

热门产品

  • 域名注册
  • 云服务器
  • 区块链服务
  • 消息队列
  • 网络加速
  • 云数据库
  • 域名解析
  • 云存储
  • 视频直播

热门推荐

  • 人脸识别
  • 腾讯会议
  • 企业云
  • CDN加速
  • 视频通话
  • 图像分析
  • MySQL 数据库
  • SSL 证书
  • 语音识别

更多推荐

  • 数据安全
  • 负载均衡
  • 短信
  • 文字识别
  • 云点播
  • 商标注册
  • 小程序开发
  • 网站监控
  • 数据迁移

Copyright © 2013 - 2023 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有

深圳市腾讯计算机系统有限公司 ICP备案/许可证号: 粤B2-20090059 深公网安备号 44030502008569

腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287

问题归档 专栏文章 快讯文章归档 关键词归档 开发者手册归档 开发者手册 Section 归档

Copyright © 2013 - 2023 Tencent Cloud.

All Rights Reserved. 腾讯云 版权所有

登录 后参与评论
 
推荐文章
没有腹肌的松鼠  ·  【问诊2024中国经济】林毅夫:对近期中国发展悲观论调的剖析和辩驳
8 月前
果断的海豚  ·  新闻 | 电子系协同智能中心与昌平区未来高教园及多所高校开展交流,共话智能无人平台建设-清华大学电子工程系
8 月前
愉快的匕首  ·  RE6旅行者被雷电将军强吻_单机游戏热门视频
9 月前
听话的板栗  ·  张献龙:论文写在大地 人才成于创新_人才培养_新闻_南湖新闻网
1 年前
失恋的橡皮擦  ·  惊悚片《拜访小屋》:剧情刺激感与娱乐性兼具,观众一刻都不能放松_其他文化娱乐_什么值得买
1 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号