MySQL 面试题

1.CHAR和VARCHAR有什么区别

  1. CHAR是定长的,而VARCHAR是可以变长的

  2. CHAR尾部的空格会被删除,而VARCHAR不会

  3. CHAR存储的就是字符串去除尾空格后的原始内容,而VARCHAR会在开头使用1-2个字节标识存储 的字符串的长度,在字符串结尾使用一个字节表示字符串结束。

  4. CHAR英文字符占有一个字节,汉字占两个字节,而VARCHAR对每个字符都使用两个字节

(1)float和double的区别是什么

float 最多可以存储 8 位的十进制数,并在内存中占 4 字节。

double 最可可以存储 16 位的十进制数,并在内存中占 8 字节。

2.什么是数据库设计的三大范式

第一范式(1NF):字段(或属性)是不可分割的最小单元,即不会有重复的列,体现原子性

第二范式(2NF):满足 1NF 前提下,存在一个候选码,非主属性全部依赖该候选码,即存在主 键,体现唯一性,专业术语则是消除部分函数依赖

第三范式(3NF):满足 2NF 前提下,非主属性必须互不依赖,消除传递依赖 除了三大范式外, 还有BC范式和第四范式,但其规范过于严苛,在生产中往往使用不到。

3.说一下索引的分类

1. 从物理结构上分

  1. 聚簇索引:指索引的键值的逻辑顺序与表中相应行的物理顺序一致,即每张表只能有一个聚 簇索引。

  2. 非聚簇索引:指索引的键值的逻辑顺序与数据行的物理顺序不一致。

2. 从应用上划分

  1. 普通索引:mysql中的基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和 控制,纯粹是为了提高查询效率。

  2. 唯一索引:索引列中的值必须是唯一的,但是允许为空值。

  3. 主键索引:特殊的唯一索引,也称为聚簇索引,不允许有空值,并由数据库帮我们自动创 建。 4. 组合索引:组合表中多个字段创建的索引,遵守最左前缀匹配规则

  4. 全文索引:只有在 MyISAM 引擎上才能使用,同时只支持 CHAR、VARCHAR、TEXT 类型字 段上 使用

(1)说一下什么是索引

索引是对数据库表中一列或者多列的值进行排序的存储结构,用于快速访问数据库表中的特定信息。他 的作用相当于图书的目录,可以根据这个目录快速找到所需要的内容。索引是针对表而建立的,以便加 速检索物理数据。

(2)索引的数据结构

Mysql中常用的是Hash和B+树 Hash索引底层就是hash表,进行查询的时候调用hash函数获取到相应的键值,然后回表查询获得实际 数据 B+树索引底层实现的原理是多路平衡查找树,对于每一次的查询都是从根节点触发,查询到叶子节点放 可以获得所查键值,最后查询判断是否需要回表查询。

(3)索引失效的几种情况

  1. like 以%开头就会失效,但是后缀有%不会失效

  2. or语句前后没有同时使用索引

  3. 联合索引不使用第一列会失效

  4. 数据类型出现隐式转化,比如varchar不加单引号可能会自动转换为int型

  5. 在索引列上使用了is null或者is not null操作,最好给列设置默认值

  6. 在索引字段上使用了not、<>、!=会导致索引失效

  7. 对索引字段进行计算操作,字段上使用函数会导致索引失效

  8. 当mysql觉得全表扫描更快时(数据少)

3.索引的优缺点

  1. 大大加快了数据的检索速度,可以保证数据库表中每一行数据的唯一性

  2. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性

  3. 可以加速表与表之间的连接,特别是在实现数据的参考完整性方面特别有意义

  4. 在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间

  5. 通过索引,可以在查询的过程中使用优化隐藏起,提高系统性能

  6. 创建和维护索引耗费时间,数据量越大,数据的维护速度越低

  7. 索引会占用物理空间,这样除了数据库表占用数据空间外,索引还要占据一定的空间,所占用的资 源就比较多。

4.索引的数据结构?

索引的数据结构和具体存储引擎的实现有关,MySQL 中常用的是 Hash 和 B+ 树索引。 Hash 索引底层就是 Hash 表,进行查询时调用 Hash 函数获取到相应的键值(对应地址),然后 回表查询获得实际数据. B+ 树索引底层实现原理是多路平衡查找树,对于每一次的查询都是从根节点出发,查询到叶子节 点方可以获得所查键值,最后查询判断是否需要回表查询.

5.Hash 和 B+ 树索引的区别?

Hash

1)Hash 进行等值查询更快,但无法进行范围查询。因为经过 Hash 函数建立索引之后,索引的 顺序与 原顺序无法保持一致,故不能支持范围查询。同理,也不支持使用索引进行排序。

2)Hash 不支持模糊查询以及多列索引的最左前缀匹配,因为 Hash 函数的值不可预测,如 AA 和 AB 的 算出的值没有相关性。

3)Hash 任何时候都避免不了回表查询数据.

4)虽然在等值上查询效率高,但性能不稳定,因为当某个键值存在大量重复时,产生 Hash 碰 撞,此 时查询效率反而可能降低。

B+ Tree

1)B+ 树本质是一棵查找树,自然支持范围查询和排序。

2)在符合某些条件(聚簇索引、覆盖索引等)时候可以只通过索引完成查询,不需要回表。

3)查询效率比较稳定,因为每次查询都是从根节点到叶子节点,且为树的高度。

6.如何获取当前数据库版本

使用 select version() 获取当前 MySQL 数据库版本。

(1)怎么验证mysql的索引是否满足需求

使用 explain 查看 SQL 是如何执行查询语句的,从而分析你的索引是否满足需求。

explain 语法:explain select * from table where type=1。

7.说一下ACID是什么

A:原子性,一个事务中的所有操作,要么全部完成,要么全部失败,事务是最小操作单元,不可分 割。

C:一致性:在事务开始之前和结束之后,数据库的完整性没有被破坏。

I:隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,可以防止多个事务并发执 行时由于交叉执行而造成数据不一致的情况。事务隔离分不同级别:读未提交、读提交、可重复读、串 行化。

D:持久性:事务处理结束后,对数据的修改就是永久的。

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

inner join:内连接,把匹配关联的表的数据全部显示出来

left join:左连接,以左表为主显示全部的数据,右表显示符合条件的数据

right join:右连接,以右表为主显示全部的数据,左表显示符合条件的数据

9.说一下数据库的事务隔离

事务的隔离性

脏读:指在一个事务处理过程中读到了另一个未提交的事务中的数据。

不可重复读:指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据,这是 由于在查询间隔,被另外一个事务修改并提交了。

幻读:一个事务在前后两次查询同一个范围时,后一次查询看到了前一次查询没有看到的数据。

事务的隔离级别

Read uncommitted (读未提交):最低级别,以上问题均无法解决。

Read committed (读已提交):读已提交,可避免脏读情况发生。

Repeatable Read(可重复读):确保事务可以多次从一个字段中读取相同的值,在此事务持续 期间,禁止其他事务对此字段的更新,可以避免脏读和不可重复读,仍会出现幻读问题。 Serializable (串行化):最严格的事务隔离级别,要求所有事务被串行执行,不能并发执行,可 避免脏读、不可重复读、幻读情况的发生。

10.说一下mysql常用的引擎

  1. InnoDB:提供了对数据库ACID事务的支持,提供了行级锁和外键的约束。他会在内存中建立缓冲 池,用于缓冲数据和索引。启动比较慢,不会保存表的行数,所以在查询行数的时候他需要扫描全 表得出行数。

  2. MyISAM:mysql的默认引擎,不支持事务、行级锁和外键,支持表锁。因此插入和更新操作,需 要锁定这个表,效率会低一点。不过它保存了表的行数,所以在查询行数时不需要扫描全表。 3. 查询操作多且不需要事务支持的优先用MyISAM,写操作多的且需要事务支持的有限用InnoDB。

(1)说以下mysql的行锁和表锁

InnoDB支持表锁和行锁,且默认为行锁;而MyISAM只支持表锁。 表锁:开销小,加锁快,不会出现死锁。锁的粒度大,发生锁冲突的概率最高,并发量最低。 行锁:开销大,加锁慢,会出现死锁。锁的粒度小,发生锁冲突的概率小,并发度最高。

(2)说一下乐观锁和悲观锁

乐观锁:每次去拿数据的时候都认为别人不会修改,所以不会上锁,但在提交更新的时候会判断以下在 此期间别人有没有去更新这个数据。 悲观锁:每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿数 据就会阻止,直到这个锁被释放。

11.如何做mysql的性能优化

  1. 为搜索字段创建索引

  2. 避免使用 select *查询,使用具体字段查询

  3. 垂直分割分表

  4. 选择正确的存储引擎

相关推荐
苹果醋31 小时前
React源码02 - 基础知识 React API 一览
java·运维·spring boot·mysql·nginx
了一li1 小时前
Qt中的QProcess与Boost.Interprocess:实现多进程编程
服务器·数据库·qt
码农君莫笑2 小时前
信管通低代码信息管理系统应用平台
linux·数据库·windows·低代码·c#·.net·visual studio
别致的影分身2 小时前
使用C语言连接MySQL
数据库·mysql
过过过呀Glik2 小时前
在 Ubuntu 上安装 MySQL 的详细指南
mysql·ubuntu
京东零售技术4 小时前
“慢”增长时代的企业数据体系建设:超越数据中台
数据库
sdaxue.com4 小时前
帝国CMS:如何去掉帝国CMS登录界面的认证码登录
数据库·github·网站·帝国cms·认证码
o(╥﹏╥)5 小时前
linux(ubuntu )卡死怎么强制重启
linux·数据库·ubuntu·系统安全
阿里嘎多学长5 小时前
docker怎么部署高斯数据库
运维·数据库·docker·容器
Yuan_o_5 小时前
Linux 基本使用和程序部署
java·linux·运维·服务器·数据库·后端