1. MySQL中内连接与左外连接的区别?

内连接:显示两个表中完全匹配条件的数据,也是两个表的交集。
左外连接:左表显示全部数据,右表满足条件则显示,不满足条件以null值填充。

内连接举例说明:需要精准匹配数据的场景,比如查询表订单详情当中的商品信息。
左外连接举例说明:比如统计员工一个月之内的考勤记录,这里的考勤记录也是包含未打卡员工的。


  1. SQL的执行顺序?

from --> where --> group by --> count(*) --> having --> select --> distinct --> order by --> limit

从那个表中-->查询条件-->分组-->聚合函数-->分组后的查询条件-->查询的字段-->去除重复的数据-->排序-->分页

  1. MySQL数据库中存储引擎InnoDB和MyISAM的区别?
    InnoDB:
  • InnoDB是MySQL中默认的存储引擎:
  • 支持 ACID 事务,适用于需保证数据一致性的场景(如转账、订单支付)
  • 默认支持行锁(仅锁定被修改的行,适合高并发写入场景),手动支持表锁(任何写操作都会锁定整个表。例如执行 INSERT 时,所有 SELECT 被阻塞)
  • 聚簇索引,数据与主键索引绑定,主键查询极快
  • 支持外键约束,自动维护数据完整性
  • 存储方式:数据和索引存储在表空间文件(.ibd),支持压缩表

MyISAM:

  • 不支持事务,写操作失败可能导致数据不一致。例如批量插入中途中断,部分数据已写入但无法回滚
  • 只支持表锁,不支持行锁
  • 非聚簇索引,索引与数据文件(.MYD)分离,需两次查找(先找索引再定位数据)
  • 不支持外键,需在应用层保证逻辑
  • 数据(.MYD)、索引(.MYI)、表结构(.frm)分离存储,适合静态数据归档
  1. 谈谈对ACID事务的理解。
    *原子性:事务中的所有操作要么全部成功提交,要么全部失败回滚,不可分割。例如转账操作中,扣款和加款必须同时成功或失败
  • 一致性:事务执行前后,数据库必须保持合法状态(如账户总额不变)。例如转账时A账户-100,B账户+100,总额一致
  • 隔离性:并发事务之间互不干扰,防止脏读、不可重复读、幻读
  • 持久性:事务提交后,修改永久保存,即使系统故障也不丢失
  1. 为什么MySQL数据库索引底层采用的是B+树?
    叶子节点(存储完整数据或主键)和非叶子节点(仅存储索引键)存储的数据不一样,可以使用尽量深度底的树来存储大量的数据,树的深度越低,查询的次数就越少,查询的性能就越好,并且叶子节点是一个双向链表,支持范围查询,也能够提高访问效率。
    对比二叉树:二叉树每个节点仅2个子节点,数据量较大时树高度急剧增加。例如,100万数据二叉树高度约20层,导致20次IO,而B+树仅需3次
    对比B树:B树的数据分布在所有节点,范围查询需多次回溯非叶子节点,效率低
    对比哈希索引:哈希索引仅支持等值查询,无法处理范围查询
    对比红黑树:红黑树节点分散,无法保证相邻节点在同一磁盘页,预读效率低