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. 选择正确的存储引擎

相关推荐
夜泉_ly1 小时前
MySQL -安装与初识
数据库·mysql
qq_529835352 小时前
对计算机中缓存的理解和使用Redis作为缓存
数据库·redis·缓存
月光水岸New4 小时前
Ubuntu 中建的mysql数据库使用Navicat for MySQL连接不上
数据库·mysql·ubuntu
狄加山6754 小时前
数据库基础1
数据库
我爱松子鱼5 小时前
mysql之规则优化器RBO
数据库·mysql
chengooooooo5 小时前
苍穹外卖day8 地址上传 用户下单 订单支付
java·服务器·数据库
Rverdoser6 小时前
【SQL】多表查询案例
数据库·sql
Galeoto6 小时前
how to export a table in sqlite, and import into another
数据库·sqlite
人间打气筒(Ada)6 小时前
MySQL主从架构
服务器·数据库·mysql
leegong231116 小时前
学习PostgreSQL专家认证
数据库·学习·postgresql