请问做网站和编程哪个容易些,全国建设信息网,网站建设 seo模块,上海城隍庙小吃街攻略美团面试#xff1a;索引的设计规范#xff0c;你知道哪些#xff1f;
尼恩说在前面
在40岁老架构师 尼恩的读者交流群(50)中#xff0c;尼恩一直在指导大家改造简历、指导面试。指导很多小伙伴拿到了一线互联网企业网易、美团、字节、如阿里、滴滴、极兔、有赞、希音、百…美团面试索引的设计规范你知道哪些
尼恩说在前面
在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 TextMySQL5.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请到下面公号【技术自由圈】取↓↓↓