- MySQL中内连接与左外连接的区别?
内连接:显示两个表中完全匹配条件的数据,也是两个表的交集。
左外连接:左表显示全部数据,右表满足条件则显示,不满足条件以null值填充。
内连接举例说明:需要精准匹配数据的场景,比如查询表订单详情当中的商品信息。
左外连接举例说明:比如统计员工一个月之内的考勤记录,这里的考勤记录也是包含未打卡员工的。
- SQL的执行顺序?
from --> where --> group by --> count(*) --> having --> select --> distinct --> order by --> limit
从那个表中-->查询条件-->分组-->聚合函数-->分组后的查询条件-->查询的字段-->去除重复的数据-->排序-->分页
- MySQL数据库中存储引擎InnoDB和MyISAM的区别?
InnoDB:
- InnoDB是MySQL中默认的存储引擎:
- 支持 ACID 事务,适用于需保证数据一致性的场景(如转账、订单支付)
- 默认支持行锁(仅锁定被修改的行,适合高并发写入场景),手动支持表锁(任何写操作都会锁定整个表。例如执行 INSERT 时,所有 SELECT 被阻塞)
- 聚簇索引,数据与主键索引绑定,主键查询极快
- 支持外键约束,自动维护数据完整性
- 存储方式:数据和索引存储在表空间文件(.ibd),支持压缩表
MyISAM:
- 不支持事务,写操作失败可能导致数据不一致。例如批量插入中途中断,部分数据已写入但无法回滚
- 只支持表锁,不支持行锁
- 非聚簇索引,索引与数据文件(.MYD)分离,需两次查找(先找索引再定位数据)
- 不支持外键,需在应用层保证逻辑
- 数据(.MYD)、索引(.MYI)、表结构(.frm)分离存储,适合静态数据归档
- 谈谈对ACID事务的理解。
*原子性:事务中的所有操作要么全部成功提交,要么全部失败回滚,不可分割。例如转账操作中,扣款和加款必须同时成功或失败
- 一致性:事务执行前后,数据库必须保持合法状态(如账户总额不变)。例如转账时A账户-100,B账户+100,总额一致
- 隔离性:并发事务之间互不干扰,防止脏读、不可重复读、幻读
- 持久性:事务提交后,修改永久保存,即使系统故障也不丢失
- 为什么MySQL数据库索引底层采用的是B+树?
叶子节点(存储完整数据或主键)和非叶子节点(仅存储索引键)存储的数据不一样,可以使用尽量深度底的树来存储大量的数据,树的深度越低,查询的次数就越少,查询的性能就越好,并且叶子节点是一个双向链表,支持范围查询,也能够提高访问效率。
对比二叉树:二叉树每个节点仅2个子节点,数据量较大时树高度急剧增加。例如,100万数据二叉树高度约20层,导致20次IO,而B+树仅需3次
对比B树:B树的数据分布在所有节点,范围查询需多次回溯非叶子节点,效率低
对比哈希索引:哈希索引仅支持等值查询,无法处理范围查询
对比红黑树:红黑树节点分散,无法保证相邻节点在同一磁盘页,预读效率低