Go语言八股之Mysql基础详解

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。

非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

前言

小郑最近在准备Go语言的面试题,通过github和b站等各种学习网站上学习go语言的八股文,并且整理出自己觉得面试可能会问到的知识点,希望通过做笔记的方式来巩固自己的知识点,并且也希望可以帮助到大家在面试的时候更加得心应手一些,那么从现在开始,和我一起加入八股学习之旅吧!

1. 数据库的三范式是什么?

  • 第一范式:强调的是列的原子性,即数据库表的每一列都是不可分割的原子数据项。
  • 第二范式:要求实体的属性完全依赖于主关键字。(不能出现部分依赖)

不符合第二范式:

|--------|----------|----------|----------|
| 学号 | 课程ID | 课程名称 | 学生姓名 |
| 1 | C001 | 数学 | 张三 |
| 1 | C002 | 物理 | 张三 |
| 2 | C001 | 数学 | 李四 |

在上述表格中,学号和课程ID共同构成主键,但学生姓名(张三、李四)只依赖于学号而非整个主键。因此,学生姓名没有完全依赖于主键,是部分依赖。

  • 第三范式:任何非主属性不依赖于其它非主属性。 (不能出现传递依赖)

2. MySQL 支持哪些存储引擎?

MySQL 支持多种存储引擎,比如 InnoDB,MyISAM,Memory,Archive 等等.在大多数的情况下,直接选择使用 InnoDB 引擎都是最合适的,InnoDB 也是 MySQL 的默认存储引擎。 MyISAM 和 InnoDB 的区别有哪些:

  • InnoDB 支持事务,MyISAM 不支持
  • InnoDB 支持外键,而 MyISAM 不支持
  • InnoDB 是聚集索引,数据文件是和索引绑在一起的,必须要有主键,通过主键索引效率很高;MyISAM 是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针,主键索引和辅助索引是独立的。
  • Innodb 不支持全文索引,而 MyISAM 支持全文索引,查询效率上 MyISAM 要高;
  • InnoDB 不保存表的具体行数,MyISAM 用一个变量保存了整个表的行数。
  • MyISAM 采用表级锁(table-level locking);InnoDB 支持行级锁(row-level locking)和表级锁,默认为行级锁。

3.超键、候选键、主键、外键分别是什么?

超键: 是一个属性集,只有能唯一标识每一行,就被认为是超键 (超键可以有冗余信息)

学号 姓名 电话号码
1 张三 1234
2 李四 5678

在这个表中,学号 是超键,因为它可以唯一标识每一行。实际上,学号 + 姓名学号 + 电话号码等也都是超键,但它们包含了冗余信息。

候选键:是超键的子集,能够标识表中每一行的最小属性集,也就是说候选码没有冗余属性的超键,一个表可以有多个候选键

主键:从候选键中选一个出来,要满足唯一性和非空性。

外键: 是一个表中的一个或多个字段,用来建立与其他表之间的关联

4. SQL 约束有哪几种?

  • NOT NULL: 用于控制字段的内容一定不能为空(NULL)。
  • UNIQUE: 控件字段内容不能重复,一个表允许有多个 Unique 约束。
  • PRIMARY KEY: 也是用于控件字段内容不能重复,但它在一个表只允许出现一个。
  • FOREIGN KEY: 用于预防破坏表之间连接的动作,也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。
  • CHECK: 用于控制字段的值范围。

5.MySQL 中的 varchar 和 char 有什么区别?

char 是一个定长字段,假如申请了char(10)的空间,那么无论实际存储多少内容.该字段都占用 10 个字符

varchar 是变长的 ,也就是说申请的只是最大长度,占用的空间为实际字符长度+1,最后一个字符存储使用了多长的空间.

在检索效率上来讲,char > varchar,因此在使用中,如果确定某个字段的值的长度,可以使用 char,否则应该尽量使用 varchar.

6. MySQL中 in 和 exists 区别

MySQL中的in语句是把外表和内表作hash 连接,而exists语句是对外表作loop循环,每次loop循环再对内表进行查询。

一直大家都认为exists比in语句的效率要高,这种说法其实是不准确的。这个是要区分环境的。 如果查询的两个表大小相当,那么用in和exists差别不大。

如果两个表中一个较小,一个是大表,则子查询表大的用exists子查询表小的用in

not in 和not exists:

如果查询语句使用了not in,那么内外表都进行全表扫描,没有用到索引

而not extsts的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快。

7. drop、delete与truncate的区别

三者都表示删除,但是三者有一些差别:

8. 什么是存储过程?有哪些优缺点?

存储过程是一些预编译的 SQL 语句。存储过程类似于一个方法集,里面用很多写好的方法,它是由T-SQL语句组成的代码块,像方法一样实现一些功能(对单表或者多表的增删改查),在用到的时候调用他即可

优点:可以降低网络通信量,提高通信速率,可以一定程度上确保数据安全

缺点:在互联网项目中,迭代太快,项目的生命周期也比较短,人员流动相比于传统的项目也更加频繁,在这样的情况下,存储过程的管理确实是没有那么方便,同时,复用性也没有写在服务层那么好。

9. MySQL 执行查询的过程

  1. 客户端通过 TCP 连接发送连接请求到 MySQL 连接器,连接器会对该请求进行权限验证及连接资源分配
  2. 查缓存。(当判断缓存是否命中时,MySQL 不会进行解析查询语句,而是直接使用 SQL 语句和客户端发送过来的其他原始信息。所以,任何字符上的不同,例如空格、注解等都会导致缓存的不命中。)
  3. 语法分析(SQL 语法是否写错了)。 如何把语句给到预处理器,检查数据表和数据列是否存在,解析别名看是否存在歧义。
  4. 优化。是否使用索引,生成执行计划。
  5. 交给执行器,将数据保存到结果集中,同时会逐步将数据缓存到查询缓存中,最终将结果集返回给客户端。

注:此文借鉴于github地址

❤️❤️❤️小郑是普通学生水平,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

相关推荐
问道飞鱼29 分钟前
【数据库知识】Mysql进阶-高可用MHA(Master High Availability)方案
数据库·mysql·adb·高可用·mha
tiging30 分钟前
centos7.x下,使用宝塔进行主从复制的原理和实践
数据库·mysql·adb·主从复制
一只fish1 小时前
MySQL 8.0 OCP 1Z0-908 题目解析(2)
数据库·mysql
Lw老王要学习3 小时前
Linux数据库篇、第一章_02_MySQL的使用增删改查
linux·运维·数据库·mysql·云计算·it
林下清风~3 小时前
MySQL——九、锁
数据库·mysql
xiaogai_gai5 小时前
有效的聚水潭数据集成到MySQL案例
android·数据库·mysql
web130933203985 小时前
Mysql的安装配置教程(非常详细)从零基础入门到精通,看完这一篇就够了
数据库·mysql
鹅鹅鹅呢5 小时前
mysql 登录报错:ERROR 1045(28000):Access denied for user ‘root‘@‘localhost‘ (using password Yes)
android·数据库·mysql
在人间负债^5 小时前
假装自己是个小白 ---- 重新认识MySQL
android·数据库·mysql