mysql面试题

MySQL面试题(2024最详细版,后续还需继续更新)

1.char和varchar的区别

①char设置多少长度就是多少长度,varchar可以改变长度,所以char的空间利用率不如varchar的空间利用率高。
②因为长度固定,所以存取速度要比varchar快。
③char适用于固定长度的字符串,比如身份证号、手机号等,varchar适用于不固定的字符串。

2.数据库的三大范式

第一范式(1NF): 保证字段不可再分,保证原子性。
第二范式(2NF): 满足1NF前提下,表的每一列都必须和主键有关系。消除部分依赖关系。
第三范式(3NF): 满足2NF前提下,表的每一列比必须和主键有直接关系,不能是间接关系。消除传递依赖

3.你了解sql的执行顺序吗?

select distinct(去重) 聚合函数

from 表1

[inner join | left join | right join](连接) 表2

on(连接条件) 表1.字段 = 表2.字段

where 查询条件

group by(分组) 字段

having 分组过滤条件

order by(排序) 字段

limit(分页) 0,10

4.索引是什么

是一种高效获取数据的数据结构,相当于目录,更快的找到数据,是一个文件,占用物理空间。

5.索引的优点和缺点

优点:

  • 索引能够大幅度减少查询数据所需的时间。
  • 唯一索引可以确保表中不会有重复的记录,有助于维护数据的完整性。
  • 在进行表与表之间的连接操作时,如果连接键上建立了索引,可以显著加快连接的速度。
  • 对于涉及到ORDER BY和GROUP BY操作的查询,如果相关列上有索引,数据库可以更快地完成排序和分组操作。
  • 在高并发环境下,索引可以帮助减少对表的锁定,提高并发性能。

缺点:

  • 索引需要额外的存储空间,而且随着数据量的增长,索引文件也会相应增大,可能会占用大量的磁盘空间。
  • 插入、删除和更新数据时,数据库不仅要更新数据本身,还需要维护索引结构,这会增加额外的处理时间,降低写操作的效率。
  • 创建索引需要时间,尤其是在大型表上,而且随着数据的不断变化,维护索引(如重平衡B树索引)也需要消耗资源。
  • 不恰当的索引设计,如在低选择性(索引列中值的多样性低)的列上建立索引,或者创建过多不必要的索引,反而可能导致查询性能下降。
  • 索引的引入增加了数据库设计和优化的复杂度,需要开发者和DBA有深入的理解才能合理使用。

6.索引的类型

普通索引: 基本索引类型,允许定义索引的字段为空值和重复值。

唯一索引: 索引的值必须唯一,允许定义索引的字段为空值。

主键索引: 索引的值必须唯一,不可以为空。

**聚合索引(聚簇索引):**将数据与索引放在一起,索引结构的叶子结点保存了行数据,必须有且只有一个

**非聚合索引(非聚簇索引):**将数据与索引分开存储,索引结构的叶子节点存储的是对应行的主键,可以有多个

**覆盖索引:**指在数据库查询过程中,索引包含了查询所需要的所有列的数据,使得数据库管理系统能够直接从索引中获取全部信息,而无需回表查询实际的数据行。

**创建索引的语句:https://blog.csdn.net/qq_61739754/article/details/139667555?spm=1001.2014.3001.5501

7.回表查询

根据二级索引找到存二级索引的B+树,然后匹配叶子结点的主键值,根据主键值再去找存聚集索引的B+树,找到数据的过程就叫回表。即经过两个B+树查询:二级索引的树–主键索引的树。效率低,应尽量避免回表。(就是通过二级索引找到对应的主键值,然后再通过主键值找到聚集索引中所对应的整行数据,这个过程就是回表

8.索引怎么设计(优化)

①选择唯一性索引:值是唯一的,查询的更快。
②经常作为查询条件的字段加索引。
③为经常需要排序、分组和联合操作的字段建立索引:order by、group by、union(联合)、distinct(去重)等。
④限制索引个数:索引数量多,需要的磁盘空间就越多,更新表时,对索引的重构和更新就很费劲。
⑤表数据少的不建议使用索引(百万级以内):数据过少,有可能查询的速度,比遍历索引的速度都快。
⑥删除不常用和不再使用的索引。
⑦用类型小的类型做索引:比如:int和BIGINT能用int就使用int。因为类型小,查询速度快和索引占用的空间更少。
⑧使用前缀索引,要是字符串越长,那么索引占的空间越大,并且比较起来就时间就越长。

9.怎么避免索引失效(也属于sql优化的一种)

①某列使用范围查询(>、<、like、between and)时, 右边的所有列索引也会失效。
②不要对索引字段进行运算。
③在where子句中不要使用 OR、!=、<>和对值null的判断。
④避免使用’%'开头的like的模糊查询。
⑤字符串不加单引号,造成索引失效。

10.索引的数据类型

Hash: 查询时调用Hash函数获得地址,回表查询实际数据。(InnoDB和MylSAM不支持,Memory支持)。
B+树: 每次从根节点出发去查询,然后得到地址,回表查询实际数据。

详细的树结构:https://cloud.tencent.com/developer/article/2197608

11.B树和B+树的区别

  • B+树的叶子节点存放数据,非叶子节点存放索引,而B树中非叶子节点和叶子节点都会存放数据,正应为这样B+树就更加的矮,减少Io的次数。
  • 在B+树中,所有实际的数据都存储在叶子节点上,并且叶子节点通过指针相连,形成了一个有序的链表。这种结构特别适合范围查询和全表扫描,因为一旦找到匹配的起始点,就可以快速遍历链表。而B树只适合随机查找。
  • B+树的所有查询最终都会到达叶子节点,这意味着无论查询的键值在树中的什么位置,查询路径的长度都是相同的。相比之下,B树的查询可能会在非叶子节点结束,这可能导致查询性能不稳定。

12.Mysql怎么查看是否使用到索引或怎么查看sql执行计划

explain

id:表示查询中执行select子句或操作表的顺序。如果有多张表联合查询,id编号可以指示执行的先后顺序。相同id的执行顺序从上至下,不同id间,数字越大执行优先级越高。

table:表示查询中表的名字,可能是实际的表,也可能是派生表或临时表。

type(非常重要):显示MySQL决定如何查找表中的行,常见的类型有ALL(全表扫描)、index(索引全扫描)、range(索引范围扫描)、ref(索引引用扫描)、eq_ref(唯一索引扫描,常用于JOIN操作)、const(常量比较,表最多有一个匹配行,速度快)、NULL(不访问任何表)。

key:显示MySQL实际决定使用的索引,如果没有选择索引,则此列为NULL。

key_len:表示索引中使用的字节数,可以帮助判断索引是否完全被使用(覆盖索引)。

ref:显示使用哪个列或常数与key一起从表中选择行。

13.sql执行慢该如何排查和优化

排查

  1. 开启慢查询日志,设置slow_query_log = 1,并定义long_query_time(如设置为2秒)来开启和配置慢查询日志。
  2. 查看慢查询日志(定位低效率sql,命令:show processlist)。
  3. 使用explain查看sql的执行计划(看看索引是否失效或者性能低)

优化

①不要用select *,要使用具体字段。
②使用数值代替字符串,比如:0=唱,1=跳,2=rap。
③避免返回大量数据,采用分页最好。
④使用索引,提升查询速度,不宜建太多索引,不能建在重复数据比较多的字段上。
⑤批量插入比单条插入要快,因为事务只需要开启一次,数据量太小体现不了。
⑥避免子查询,优化为多表连接查询。
⑦尽量使用union all替代union,因为union会自动去重。

14.MySQL常见的存储引擎

功能 MylSAM MEMORY InnoDB
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值