MySQL重点,面试题

一、 聚合函数

分类

  1. COUNT:统计行数量
  2. SUM:获取单个列的合计值
  3. AVG:计算某个列的平均值
  4. MAX:计算列的最大值
  5. MIN:计算列的最小值


二、SQL关键字

  1. 分页:limit
    SELECT * FROM student limit 100,6; 倒序 desc select * from user order by id desc limit 0 6
  2. 分组:group by
    SELECT sex , count(*) FROM student group by sex
  3. 去重:distinct
    select distinct name FROM student;

三、SQL Select 语句完整的执行顺序

from

left join

on

where

group by

having

select

avg()/sum()

order by

asc/desc

limit

四、数据库三大范式

第一范式

1NF 原子性,不可再分

第二范式

2NF 唯一标识 主要解决行的冗余

  1. 每一行数据有唯一主键
  2. 非关键字必须依赖于主键字段

第三范式

3NF 直接性,非主键字段不依赖于其它非主键字段,主要解决列 的冗余

在使用时有时会打破第三范式

保留冗余字段。当两个或多个表在查询中经常需要连接时,可以在其中一个表上增加若干冗余的字段,以 避免表之间的连接过于频繁

五、存储引擎

MyISAM 存储引擎 与 InnoDB 引擎区别

  1. 事务支持:MyISAM不支持,InnoDB支持,通过事务确保数据完整性和一致性
  2. 锁定机制:MyISAM 表级 锁,读操作会被阻塞,InnoDB 行级锁,可以减少锁定冲突和死锁的发生
  3. 外键支持:MyISAM不支持外键约束,InnoDB支持外键约束,可以通过外键约束保证数据的引用完整性
  4. 并发性能:InnoDB更优

六、数据库事务

1.事务特性(ACID)

  1. 原子性
  2. 一致性
  3. 隔离性
  4. 持久性
    undo_log 解决原子性和一致性
    redo_log解决持久性 记录写操作,Mysql异常关闭时会重新加载写操作恢复数据,保证数据持久性

2、隔离级别

  1. 读未提交:所有事务可能读取到别的事物的未提交数据,会造成脏读问题
  2. 读已提交:针对update和delete,其他事物修改了相应的数据,同一个事务多个查询语句可能返回不同结果,能看到别的事务提交时的数据,出现不可重复读问题
  3. 可重复读:针对insert,默认隔离机制,确保一个事物中多个实例在并发读取数据的时候读到一样的数据,会导致幻读
  4. 可串行化:可避免上述问题,但是效率很慢

七、索引

1. 索引的概念和优点

主要作用加快数据查找速度,提高数据库性能

优点:加快查询效率

缺点:占用内存空间,影响增删改,效率低下

2. 索引分类

  1. 普通索引,没有任何限制
  2. 唯一索引:索引列的值必须唯一,允许有空值,如会员表的手机号,身份证号
  3. 主键索引:特殊的唯一索引,唯一标记数据表中的某一记录,不允许有空值,一般用primary key约束
  4. 联合索引:多个字段上建立索引,能快速符合查询条件的检索,如手机号和密码,会员ID和订单ID,商品表分类状态
  5. 全文索引:默认不支持中文全文索引,可通过扩展MySQL,添加中文全文索引

3.索引的底层实现原理

索引是在Mysql的存储引擎层中实现,不是在服务层实现

MySQL目前支持四种索引:

  1. B+ Tree索引:最常见的索引类型,大部分索引都支持
  2. Hash索引:只有Memory引擎支持,使用场景简单
  3. R- Tree索引:空间索引,是MySQL引擎中的特殊索引
  4. S-Full-text(全文索引):MySQL引擎的特殊索引

B树和B+树的主要区别

  1. 存储数据的位置:
    B树:数据存储到所有节点
    B+树:所有数据存储在叶子节点中,非叶子节点仅包含索引信息
  2. 叶子节点之间的链接:
    B树:叶子节点之间没有链接
    B+树:叶子节点之间通过 指针相互链接,范围查询和遍历更高效

4. 如何避免索引失效

  1. 范围条件查询
  2. 索引列上操作导致索引失效(函数)
  3. 字符串不加引号
  4. or关键字连接
  5. 使用 !=
  6. like通配符开头('%abc...')

八、 数据库锁

1.行锁和表锁

行锁:访问数据库时,锁定整个行数据

表锁:访问数据库时,锁定整个表数据

行锁和表锁的区别

表锁:开销小,加锁快,不会出现死锁,锁定力度大,发生锁冲突概率高,并发度最低

行锁:开销大,加锁慢,会出现死锁,锁定力度小,发生锁冲突概率低,并发度高

2.悲观锁和乐观锁

悲观锁,每次拿到数据都加锁,效率低

乐观锁,拿到数据不会加锁,在更新时判断数据有没有更新,适用于多读的应用类型,可提高吞吐量,可以使用版本号机制

九、MySQL优化

  1. 定位执行效率慢的sql语句
  2. 优化索引
  3. sql语句调优
  4. 合理的数据库设计

定位效率慢的sql语句

  1. skywallKing查看日志
  2. explain + sql语句查询sql执行过程, 可以查看查找的sql语句是否走索引
  3. show profile 分析 SQL,可以查询到所有 sql 语句的执行效率
  4. 慢查询日志工具

优化索引的方法:

  1. 对查询频次较高 ,并且数据量较大的表,建立索引
  2. 选择最常用的索引字段
  3. 使用唯一索引
  4. 索引不是越多越好,过多索引会降低表维护效率
  5. 使用短索引,提高索引访问时的I/O效率,提升Mysql查询效率
  6. where后有多个条件时,建立复合索引,需遵循最左前缀法则

sql语句调优方法

  1. 根据业务建立复合索引只查询需要的字段
  2. 多表连接的字段需要建立索引
  3. where条件字段需要建立索引,where条件不要使用运算函数
  4. 排序字段加索引提高查询效率
  5. 优化order by语句,不使用select *
  6. 优化group by语句,默认排序,使用时可以禁止排序
  7. 尽量避免子查询,可以优化为join多表连接查询
相关推荐
小马同学-27 分钟前
mysql数据库原理
数据库·mysql
东方护航数据恢复(深圳)38 分钟前
政务信创案例:达梦 DM8 数据库掉电页损坏,48 小时修复实录【东方护航数据恢复深圳店】
数据库·数据恢复·it运维·服务器数据恢复·二次开盘·硬盘开盘
AC赳赳老秦2 小时前
OpenClaw 数据引用规范自动生成:为公开数据构建可信来源标注与标准引用体系
大数据·开发语言·汇编·数据库·人工智能·deepseek·openclaw
小蒜学长2 小时前
校园社团招新网站的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端·校园社团招新网站
布莱克6053 小时前
MySQL 增删改查(CRUD)语法详解
数据库·mysql·增删改查
Dovis(誓平步青云)3 小时前
几个方案来回选不定?做一个随时切换的候选推荐页
android·java·服务器·开发语言·javascript·数据库·智能化
2501_933670794 小时前
2027届大数据管理与应用求职数字化转型顾问:项目、SQL、业务理解怎么排优先级
数据库·sql
东方护航数据恢复(深圳)5 小时前
物流案例:勒索病毒 Mallox 加密 ERP 数据库,旧备份 + 残留页重组实录【东方护航数据恢复深圳店】
数据库·数据恢复·勒索病毒·二次开盘·开盘·数据镜像
.Hypocritical.5 小时前
Redis从入门到实战:核心原理、场景落地与避坑指南
数据库·redis·缓存
梦想画家5 小时前
SQLMesh Python 模型入门(二):依赖管理、引擎实战与内存优化
数据库·python·sqlmesh