MySQL面试基础三问

188 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

前言

        面试官说聊聊数据库表设计,几个问题后,听完我的回答,面试官如何从心态平和到心态炸裂,直接微笑再见。回来复盘一下!


 一、数据库范式

1、面试官为什么这样问?

  • 他想知道数据库设计表要注意哪些事项。
  • 他想知道设计出的表,除了满足业务性能是怎样的。
  • 在他心里一个好的表结构设计,可以是程序的基石,代码都是围绕此展开。
  • 他....

2、如何回答?

三大范式:

  1. 第一范式(1NF):每列的原子性。 给他举个例子:地址字段存广东省深圳市南山区,这样不好,而是省是一个字段存广东省,市是一个字段存深圳市...
  2. 第二范式(2NF):在第一范式基础上,根据主键或者联合主键把相关性、依赖性最高的字段放一张表。 给他举个例子:一张表里不要既有用户身份详细信息,又有这个用户的订单详细信息,这样就拆成两个表,一个用户信息表,一个订单表。
  3. 第三范式(3NF):第二范式基础上,消除依赖传递。 举个例子:张三的订单里商品是康帅傅的矿泉水,是夫猫超市。康帅傅和夫猫超市是有依赖关系的,建议另成表,消除依赖关系。
  4. 数据库还有四大范式、六大范式....可扩展展现。

二、你们的索引是怎么设计的?

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也很好,计算一次取个位置,但是范围查询,排序就瞬间失色了!