美团面试:索引的设计规范,你知道哪些?

美团面试:索引的设计规范,你知道哪些?

尼恩说在前面

在40岁老架构师 尼恩的读者交流群(50+)中,尼恩一直在指导大家改造简历、指导面试。指导很多小伙伴拿到了一线互联网企业网易、美团、字节、如阿里、滴滴、极兔、有赞、希音、百度、美团的面试资格,拿到大厂offer。

其中,数据库的面试题,是核心和重点的题目,比如前段时间小伙伴面试美团,就遇到了下面这个 题:

索引的设计规范,你知道哪些?

小伙伴虽然用过索引,但是索引的设计规范忘记得一干二净,回答也是朦朦胧胧、支支吾吾, 当然,面试也就挂了。小伙伴赶紧来求助尼恩。

在这里,尼恩在这里给大家做一下系统化、体系化的梳理,按照下面的套路去回答,可以充分展示一下大家雄厚的 “技术肌肉”,让面试官爱到 “不能自已、口水直流”

也一并把这个题目以及参考答案,收入咱们的 《尼恩Java面试宝典PDF》V154版本,供后面的小伙伴参考,提升大家的 3高 架构、设计、开发水平。

特别提示,尼恩的3高架构宇宙,尼恩Java面试宝典,都是持续升级。

《尼恩 架构笔记》《尼恩高并发三部曲》《尼恩Java面试宝典》的PDF,请到文末公号【技术自由圈】取

文章目录

  • 美团面试:索引的设计规范,你知道哪些?
    • 尼恩说在前面
    • 1、索引原理
    • 2、索引的分类
    • 3、索引的优缺点
    • 4、参考的索引设计规范
      • 4.1 索引命名规范
      • 4.2 尽量选择整型列做索引
      • 4.3 优先建立唯一性索引
      • 4.4 为经常需要排序、分组和联合操作的字段建立索引
      • 4.5 为常作为查询条件的字段建立索引
      • 4.6 限制索引的数目
      • 4.7 尽量使用数据量少的索引
      • 4.9 尽量使用前缀来索引
      • 4.10 删除不再使用或者很少使用的索引
      • 4.11 最左前缀匹配原则,非常重要的原则。
      • 4.12 尽量选择区分度高的列作为索引
      • 4.13 索引列不能参与计算,保持列“干净”
      • 4.14 尽量的扩展索引,不要新建索引
      • 4.15 考虑建立联合索引来提高查询效率
    • 参考文献:
    • 说在最后:有问题可以找老架构取经
    • 尼恩技术圣经系列PDF

1、索引原理

索引是帮助MySQL高效获取数据的数据结构,注意,是帮助高性能的获取数据。

索引好比是一本书的目录,可以直接根据页码找到对应的内容,目的就是为了加快数据库的查询速度

  • 索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。
  • 索引是一种能帮助mysql提高了查询效率的数据结构:索引数据结构

索引的存储原理大致可以概括为一句话:以空间换时间

数据库在未添加索引, 进行查询的时候默认是进行全文搜索,也就是说有多少数据就进行多少次查询,然后找到相应的数据就把它们放到结果集中,直到全文扫描完毕。

数据库添加了索引之后,通过索引快速找到数据在磁盘上的位置,可以快速地读取数据,而不用从头开始全表扫描。

一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往是存储在磁盘上的文件中的(可能存储在单独的索引文件中,也可能和数据一起存储在数据文件中)。

2、索引的分类

主键索引:primary key

  • 设定为主键后,数据库自动建立索引,InnoDB为聚簇索引,主键索引列值不能为空(Null)。

唯一索引:

  • 索引列的值必须唯一,但允许有空值(Null),但只允许有一个空值(Null)。

复合索引:

  • 一个索引可以包含多个列,多个列共同构成一个复合索引。

全文索引:

  • Full Text(MySQL5.7之前,只有MYISAM存储引擎引擎支持全文索引)。
  • 全文索引类型为FULLTEXT,在定义索引的列上支持值的全文查找允许在这些索引列中插入重复值和空值。全文索引可以在Char、VarChar 上创建。

空间索引:

  • MySQL在5.7之后的版本支持了空间索引,而且支持OpenGIS几何数据模型,MySQL在空间索引这方面遵循OpenGIS几何数据模型规则。

前缀索引:

  • 在文本类型为char、varchar、text类列上创建索引时,可以指定索引列的长度,但是数值类型不能指定。

3、索引的优缺点

优点:

  • 大大提高数据查询速度。
  • 可以提高数据检索的效率,降低数据库的IO成本,类似于书的目录。
  • 通过索引列对数据进行排序,降低数据的排序成本降低了CPU的消耗。
  • 被索引的列会自动进行排序,包括【单例索引】和【组合索引】,只是组合索引的排序需要复杂一些。
  • 如果按照索引列的顺序进行排序,对order 不用语句来说,效率就会提高很多。

缺点:

  • 索引会占据磁盘空间。
  • 索引虽然会提高查询效率,但是会降低更新表的效率。比如每次对表进行增删改查操作,MySQL不仅要保存数据,还有保存或者更新对应的索引文件。
  • 维护索引需要消耗数据库资源。

综合索引的优缺点:

  • 数据库表中不是索引越多越好,而是仅为那些常用的搜索字段建立索引效果最佳!

4、参考的索引设计规范

每个公司,都有自己的 设计规范,

尼恩这里的梳理的设计规范,可以作为大家参考。 当然,如果面试的时候能讲到这个水平,已经很牛掰了。

4.1 索引命名规范

单值索引,建议以 idx_ 为开头,字母全部小写。

例如:alter table t1 add key idx_r1(r1)

组合索引,建议以 dx_multi_ 开头,字母全部小写。

例如:alter table t1 add key idx_multi_1(r1,r2,r3) ;

唯一索引,建议以 udx_ 为开头,字母全部小写;如果是多值唯一索引,则命名方式类似 udx_multi_1 等。

例如:
alter table t1 add unique key udx_f1(r1);
或者
alter table t1 add key udx_multi_1(r1,r2,r3);

全文索引,建议以 ft_ 开头,字母全部小写,并且建议默认用 ngram 插件。

例如:alter table t1 add fulltext ft_r1(r1) with parser ngram;

前缀索引,建议以 idx_ 开头,以 _prefix 结尾。

例如: alter table t1 add key idx_r1_prefix(r1(10));

函数索引,建议以 idx_func_ 开头,字母全部小写。

例如: alter table t1 add key idx_func_r1((mod(r1,4)));

4.2 尽量选择整型列做索引

索引本身有有序的,尽量选择整型列做索引,

所以,尽量不用uuid,而是使用雪花id,页段id,等整数id去建立索引 。

雪花id,页段id的源码和原理,请参见尼恩的《视频第32章:超高并发、超高可用1000W级 ID组件 架构与实操》

如果避免不了,只有字符串做索引,可以选择对字符类型做 HASH ,再基于 HASH 结果做索引;

主键列数据类型最好也是整型,

避免对不规则的字符串建立主键(由于 INNODB 表即索引,所以应该避免掉。不仅仅 UUID 非有序,而是因为单个 UUID 太大)

4.3 优先建立唯一性索引

唯一性索引的值是唯一的,可以更快速的通过该索引来确定某条记录。

例如,学生表中学号是具有唯一性的字段。为该字段建立唯一性索引可以很快的确定某个学生的信息。

如果使用姓名的话,可能存在同名现象,从而降低查询速度。

4.4 为经常需要排序、分组和联合操作的字段建立索引

经常需要ORDER BY、GROUP BY、DISTINCT和UNION等操作的字段,排序操作会浪费很多时间。

如果为其建立索引,可以有效地避免排序操作。

4.5 为常作为查询条件的字段建立索引

如果某个字段经常用来做查询条件,那么该字段的查询速度会影响整个表的查询速度。

因此,为这样的字段建立索引,可以提高整个表的查询速度。

4.6 限制索引的数目

索引的数目不是越多越好。

每个索引都需要占用磁盘空间,索引越多,需要的磁盘空间就越大。

修改表时,对索引的重构和更新很麻烦。

越多的索引,会使更新表变得很浪费时间。

4.7 尽量使用数据量少的索引

如果索引的值很长,那么查询的速度会受到影响。

例如,对一个CHAR(100)类型的字段进行全文检索需要的时间肯定要比对CHAR(10)类型的字段需要的时间要多。

4.9 尽量使用前缀来索引

如果索引字段的值很长,最好使用值的前缀来索引。

例如,TEXT和BLOG类型的字段,进行全文检索会很浪费时间。

如果只检索字段的前面的若干个字符,这样可以提高检索速度。

4.10 删除不再使用或者很少使用的索引

表中的数据被大量更新,或者数据的使用方式被改变后,原有的一些索引可能不再需要。

数据库管理员应当定期找出这些索引,将它们删除,从而减少索引对更新操作的影响。

4.11 最左前缀匹配原则,非常重要的原则。

mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,

比如a 1=”” and=”” b=”2” c=”“> 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。

注意:=和in可以乱序。

比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,

mysql的查询优化器会帮你优化成索引可以识别的形式

4.12 尽量选择区分度高的列作为索引

区分度的公式是count(distinct col)/count(*),表示字段不重复的比例,比例越大我们扫描的记录数越少,

唯一键的区分度是1,而一些状态、性别字段可能在大数据面前区分度就 是0,

那可能有人会问,这个比例有什么经验值吗?

使用场景不同,这个值也很难确定,一般需要join的字段我们都要求是0.1以上,即平均1条扫描10条 记录

4.13 索引列不能参与计算,保持列“干净”

比如from_unixtime(create_time) = ’2014-05-29’就不能使用到索引,原因很简单,b+树中存的都是数据表中的字段值,但进行检索时,需要把所有元素都应用函数才能比较,显然成本 太大。

所以语句应该写成create_time = unix_timestamp(’2014-05-29’);

4.14 尽量的扩展索引,不要新建索引

比如表中已经有a的索引,现在要加(a,b)的索引,那么只需要修改原来的索引即可

4.15 考虑建立联合索引来提高查询效率

当单个索引字段查询数据很多,区分度都不是很大时,则需要考虑建立联合索引来提高查询效率

注意:选择索引的最终目的是为了使查询的速度变快。

参考文献:

https://www.cnblogs.com/chenhaoyu/p/8761305.html

https://zhuanlan.zhihu.com/p/391673897

说在最后:有问题可以找老架构取经

mysql相关的面试题,是非常常见的面试题。

以上的内容,如果大家能对答如流,如数家珍,基本上 面试官会被你 震惊到、吸引到。

最终,让面试官爱到 “不能自已、口水直流”。offer, 也就来了。

在面试之前,建议大家系统化的刷一波 5000页 《尼恩Java面试宝典PDF》,里边有大量的大厂真题、面试难题、架构难题。很多小伙伴刷完后, 吊打面试官, 大厂横着走。

在刷题过程中,如果有啥问题,大家可以来 找 40岁老架构师尼恩交流。

另外,如果没有面试机会,可以找尼恩来改简历、做帮扶。

尼恩指导了大量的小伙伴上岸,前段时间,刚指导一个40岁+被裁小伙伴,拿到了一个年薪100W的offer。

尼恩技术圣经系列PDF

  • 《NIO圣经:一次穿透NIO、Selector、Epoll底层原理》
  • 《Docker圣经:大白话说Docker底层原理,6W字实现Docker自由》
  • 《K8S学习圣经:大白话说K8S底层原理,14W字实现K8S自由》
  • 《SpringCloud Alibaba 学习圣经,10万字实现SpringCloud 自由》
  • 《大数据HBase学习圣经:一本书实现HBase学习自由》
  • 《大数据Flink学习圣经:一本书实现大数据Flink自由》
  • 《响应式圣经:10W字,实现Spring响应式编程自由》
  • 《Go学习圣经:Go语言实现高并发CRUD业务开发》

……完整版尼恩技术圣经PDF集群,请找尼恩领取

《尼恩 架构笔记》《尼恩高并发三部曲》《尼恩Java面试宝典》PDF,请到下面公号【技术自由圈】取↓↓↓

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/589697.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智慧园区物联综合管理平台之系统集成功能及接口需求

南向接口 高端制造园区联网平台南向主要面对各园区各项公共物联设施接入。 南向所接入的接口类型、 数据协议等也种类繁多, 平台根据实际调研情况及未来发展趋势, 梳理了十几种设备以及协议接入的情况, 依据此情况, 园区物联管理平台设计了标准的、 统一的南向的标准SDK调…

2023年12月31日_解读openai的新对齐论文

如果人类无法监督超级人工智能 那么人工智能可以么&#xff1f; 过去一年 以预测下一个Token为本质的大模型 已经横扫了人类世界的多项任务 展现了人工智能的巨大潜力 Ilya Sutskever也大胆预言 如果模型能够很好地预测下一个token 那么意味着它能够理解导致这个token产生的深刻…

多边形的填充算法的分析

多边形的填充 分析 思路一 我们之前已经实现了对直线的扫描转换&#xff0c;但是现在我们遇到了新的问题那就是如何对多边形进行填充&#xff0c;如图所示&#xff0c;如何对图示的多边形进行填充呢&#xff1f; 我所想到的第一个办法是这样的&#xff0c;那就是假设上顶点…

webRTC实时通信demo

参考文档&#xff1a; https://www.jianshu.com/p/f439ce5cc0be https://www.w3cschool.cn/socket demo流程示意图&#xff08;用户A向用户B推送视频&#xff09;&#xff1a; #mermaid-svg-0KZaDQ5DBl28zjmZ {font-family:"trebuchet ms",verdana,arial,sans-seri…

总结—elasticsearch启动失败的几种情况及解决

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 摘要 本文主要梳理从ES初学以来所遇到的启动失败的几种情况。 1、使用root用户启动失败 在有一次搭建elasticsearch的时候&am…

除了国家自然科学基金,还有以下科研基金

除了国家自然科学基金&#xff0c;还有以下科研基金&#xff1a; 国家社科基金&#xff1a;这是国家社会科学基金的简称&#xff0c;主要支持国内的社会科学研究项目。国家重点实验室和国家工程&#xff08;技术&#xff09;研究中心开放基金&#xff1a;这些基金主要支持在国…

【Linux】—— 匿名管道

前言&#xff1a; 接下来我将带大家探索 进程间通信 的方式。本期&#xff0c;要讲的就是管道其中之一“匿名管道”&#xff01;&#xff01; 目录 &#xff08;一&#xff09;进程间通信介绍 1、进程间通信目的 2、进程间通信发展 3、进程间通信分类 &#xff08;二&…

(JAVA)-(网络编程)-UDP协议

在上上文章中我们简单了解了UDP通信协议和TCP协议。这篇文章 来讲解java中如何使用UDP协议发送数据。 UDP通信协议发送数据&#xff1a; 而使用UDP通信协议发送数据也可以看成是寄快递的过程。 在寄快递的过程中&#xff0c;我们首先得找快递公司&#xff0c;接着得打包好礼物…

文件分片上传(模拟网盘效果)

文件分片上传&#xff08;模拟网盘效果&#xff09; 文章说明简单模拟拖拽文件夹和选择文件的进度条效果效果展示结合后端实现文件上传效果展示加上分片的效果效果展示加上MD5的校验&#xff0c;实现秒传和分片的效果后续开发说明源码下载 文章说明 文章主要为了学习文件上传&a…

2024年【黑龙江省安全员C证】考试及黑龙江省安全员C证找解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年黑龙江省安全员C证考试为正在备考黑龙江省安全员C证操作证的学员准备的理论考试专题&#xff0c;每个月更新的黑龙江省安全员C证找解析祝您顺利通过黑龙江省安全员C证考试。 1、【多选题】下列属于编制安全检查…

浅聊配置化-要不要实现动态表单

1、配置化的原则 配置化是一种抽象&#xff0c;把事物分成2类&#xff1a;不变的&#xff0c;可变的。 如果事物都是可变的&#xff0c;是无法实现配置化的。 配置化的根本在于找到不变的事物&#xff0c;基于不变的事物进行可变事物的配置。 所以&#xff0c;认为一切皆可…

[LLM]大模型训练(二)--DeepSpeed使用

安装DeepSpeed与集成 DeepSpeed可以通过pip安装&#xff0c;无需指定PyTorch和CUDA的版本。DeepSpeed内包含需要自定义的CUDA算子&#xff0c;将通过即时编译的方式在运行时构建。 pip install deepspeed DeepSpeed与HuggingFace Transformers直接集成。使用者可以通过在模型…

从入门到精通,30天带你学会C++【第十一天:二分查找】

目录 Everyday English 前言 二分查找 例题 50分做法 分析利弊 示例代码 示例截图 100分做法 二分查找是什么&#xff1f; 这题该怎么用二分查找&#xff1f; 示例代码 示例截图 结尾 Everyday English Look before you leap. 三思而后行 前言 今天是2024年的…

高创驱动器设置备忘

1&#xff1a;高创驱动器连接软件SVRstudio 有一代和二代&#xff0c;这里为了简述方便称SV1,SV2版本&#xff0c;它们都可以连接驱动器&#xff0c;只是使用界面上有些差异而已&#xff0c;为了设置方便的需要&#xff0c;建议同时安装两个版本&#xff1b; 2&#xff1a;通常…

爬取糖豆视频

爬虫案例积累&#xff0c;以爬取糖豆视频为例&#xff1a; 爬取视频类型的数据一般步骤&#xff1a; 1.点击media,刷新&#xff0c;播放一个视频&#xff0c;会刷新一个包&#xff0c;点击发现是播放视频的包&#xff0c; 2.复制这个包url中的关键字&#xff0c;在搜索框中进…

在宝塔Linux中安装Docker

前言 帮助使用宝塔的用户快速上手docke的安装 &#x1f4da;&#x1f4da; &#x1f3c5;我是默&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; ​​​​ &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《Docker》。&#x1f3af;&#x1f3af…

[新版Hi3531DV200 性能强悍]

新版Hi3531DV200 性能强悍 Hi3531DV200是针对多路高清/超高清&#xff08;1080p/4M/5M/4K&#xff09;DVR产品应用开发的新一代专业SoC芯片。Hi3531DV200集成了ARM A53四核处理器和性能强大的神经网络推理引擎&#xff0c;支持多种智能算法应用。同时&#xff0c;Hi3531DV200还…

Spring Boot Admin健康检查引起的Spring Boot服务假死

问题现象 最近在spring boot项目中引入了 spring-boot-starter-actuator 后&#xff0c;测试环境开始出现服务假死的现象&#xff0c; 且这个问题十分怪异&#xff0c;只在多个微服务中的简称A的这个服务中出现&#xff0c;其他服务都没有出现这个问题&#xff0c; 之所以说…

C#学习笔记 - C#基础知识 - C#从入门到放弃 - C# Windows窗体技术及基础控件(一)

C# 入门基础知识 - C# Windows窗体技术及基础控件 第12节 Windows窗体技术及基础控件12.1 创建Winform 程序12.2 窗体的添加与删除12.3 窗体的常用属性12.4 窗体的常用事件12.5 窗体中添加控件与窗体显示和隐藏12.6 MDI 窗体12.7 窗体中控件的基本操作 更多C#基础知识点可查看&…

按照故障码类型分类的API接口

随着汽车的普及&#xff0c;车辆故障也成为了一个不可忽视的问题。对于车主来说&#xff0c;及时了解故障码的含义以及解决方案十分重要。挖数据平台为解决这一问题&#xff0c;提供了一套按照故障码类型分类的API接口&#xff0c;用于查询车辆故障、故障码适用品牌以及提供相应…