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执行慢该如何排查和优化
排查
- 开启慢查询日志,设置
slow_query_log = 1
,并定义long_query_time
(如设置为2秒)来开启和配置慢查询日志。 - 查看慢查询日志(定位低效率sql,命令:show processlist)。
- 使用explain查看sql的执行计划(看看索引是否失效或者性能低)
优化
①不要用select *,要使用具体字段。
②使用数值代替字符串,比如:0=唱,1=跳,2=rap。
③避免返回大量数据,采用分页最好。
④使用索引,提升查询速度,不宜建太多索引,不能建在重复数据比较多的字段上。
⑤批量插入比单条插入要快,因为事务只需要开启一次,数据量太小体现不了。
⑥避免子查询,优化为多表连接查询。
⑦尽量使用union all替代union,因为union会自动去重。
14.MySQL常见的存储引擎
功能 | MylSAM | MEMORY | InnoDB |
---|