本文主要对mysql相关的面试题做个整理。

数据库的三范式是什么?

  1. 列的职责单一,原子性不可再分
  2. 尽量避免数据冗余,即一行数据只做一件事,行职责单一

如何获取当前数据库版本?

select version();

mysql 的内连接、左连接、右连接有什么区别?

何为连接:就是两表根据一个关联的字段进行拼接查询。比如,A表的行数据中冗余了B表的主键信息,那么我们就可以利用冗余的这个信息,进行两表的拼接查询。

内连接:就是关联查询时,两表中关联字段值相同的数据行进行拼接,值为null的直接排除。

左连接:两表连接时,”left join”关键字左边的表为主表,右边的为附属表。数据拼接时,主表会查出条件下的全量数据,而附属表只会根据主表的关联字段查出数据,对于没有的数据,字段值以null填充。

右连接:与左连接相反。”right join”关键字右边的表为主表,左边的为附属表。数据拼接时,主表会查出条件下的全量数据,而附属表只会根据主表的关联字段查出数据,对于没有的数据,字段值以null填充。

mysql 索引是怎么实现的?

首先,mysql的存储引擎有两种,innodb,myisam

innodb索引

innodb索引为聚集索引,聚集索引就是索引树对应的叶子节点为数据行。

对于innodb,主键索引为主键值组成的b+tree,它的叶子节点即为数据行,它是一级索引。而对于其他索引行,它是由索引列的值组成的b+tree,然后叶子节点对应的数据行主键索引(一级索引)。

这也是innodb引擎为什么必须有主键的原因。

myisam索引

myisam索引为非聚集索引,非聚集索引就是索引树对应的叶子节点为数据行的地址。

对于myisam,索引列值组成的b+tree,树的叶子节点存储有数据行的地址

总结

对于两种引擎来说,查询:

innodb需要先普通索引+主键索引,获取结果

而myisam只需要根据普通索引获取到数据行的地址,再直接获取数据即可。

怎么验证 mysql 的索引是否满足需求?

 评论