本文已参与「新人创作礼」活动,一起开启掘金创作之路。
前言
面试官说聊聊数据库表设计,几个问题后,听完我的回答,面试官如何从心态平和到心态炸裂,直接微笑再见。回来复盘一下!
一、数据库范式
1、面试官为什么这样问?
- 他想知道数据库设计表要注意哪些事项。
- 他想知道设计出的表,除了满足业务性能是怎样的。
- 在他心里一个好的表结构设计,可以是程序的基石,代码都是围绕此展开。
- 他....
2、如何回答?
三大范式:
- 第一范式(1NF):每列的原子性。 给他举个例子:地址字段存广东省深圳市南山区,这样不好,而是省是一个字段存广东省,市是一个字段存深圳市...
- 第二范式(2NF):在第一范式基础上,根据主键或者联合主键把相关性、依赖性最高的字段放一张表。 给他举个例子:一张表里不要既有用户身份详细信息,又有这个用户的订单详细信息,这样就拆成两个表,一个用户信息表,一个订单表。
- 第三范式(3NF):第二范式基础上,消除依赖传递。 举个例子:张三的订单里商品是康帅傅的矿泉水,是夫猫超市。康帅傅和夫猫超市是有依赖关系的,建议另成表,消除依赖关系。
- 数据库还有四大范式、六大范式....可扩展展现。
二、你们的索引是怎么设计的?
1、面试官为什么这样问?
- 他想知道索引这个工具会不会用。
- 他想知道有没有把索引用对地方,提高性能。
- 如果索引设计好了,程序遵循索引的使用。或是程序设计完成优化性能设计索引。
2、如何回答?
我们来参考《阿里巴巴手册——泰山版》中的【索引规约】来回答吧!
编辑
第一:
唯一特性的字段可以设置为索引。 反过来说,没有唯一性的字段不要设为索引。把性别列设置为索引是没用的,不是男就是女,无法精准查询的。
编辑
第二:
关联查询的被关联字段需要有索引。 也算上我说的经常作为查询条件的列设置为索引吧。
编辑
编辑
第三:
字符串使用前缀索引。 设计索引时应考虑列的数据类型,尽量是数字(容易让计算机比较大小/查询的数据类型),如果真的要拿字符串类型做为索引,必须指定索引长度。总不能100个字,那个1000个字都去比较搜索,比如前10个字符作为索引就可以了。
编辑
第四:
索引文件具有 B-Tree 的最左前缀匹配特性,禁止使用左模糊。
编辑
第五:
联合索引优先where条件,最后一项作为order by条件 。 尽量保证联合索引生效。
注:
两个列应该使用相同的字符集进行比较,否则索引失效。例如,比较utf8列和latin1列都是索引列,关联查询,就使索引的失效。
编辑
三、加索引为什么快?
1、面试官为什么这样问?
- 他想知道你对索引的了解有多少,有多深。
2、如何回答?
那就由外向内层层拨开索引的真面目,说得越深,段位越高!
【倔强青铜】解释什么是索引。
索引用于快速查找具有特定列值的行。如果没有索引,MySQL必须从第一行开始,然后读取整个表以找到相关的行。表越大,开销就越多。
如果表有索引,MySQL可以快速确定数据文件位置,而不必查看所有数据。这比按顺序读取每一行要快得多。
所以这么看来我的那句“索引像是目录,有目录当然快!”还是很倔强的!
【秩序白银】解释索引数据结构与存储引擎
索引的数据结构有很多种:HASH、B-Tree..都可以用于排序查找的数据结构。MySQL在存储数据的时候就会维护索引,因此索引与存储引擎密切相关。MySQL的InnoDB和MyISAM存储引擎默认使用B-Tree作为索引的数据结构,MEMORY存储引擎默认使用HASH。
【荣耀黄金】解释B+Tree & hash 是种什么数据结构
B+Tree是MySQL存储引擎在B-Tree基础上优化而来的一种数据结构。结构特点:
- 叶子结点可以有很多个,所以不同于二叉树。
- 叶子结点互相指向彼此。这个特性允许存储引擎从一个叶子导航到另一个叶子,而不需要备份到根级别。(B-Tree没有这个特性)。
- innoDB分页存储每页16kb。
- 叶子节点存放数据,冗余出非叶子结点作为索引搜索页。
这种结构有什么好处呢?为什么不用hash?
用hash也很好,计算一次取个位置,但是范围查询,排序就瞬间失色了!