为什么 MySQL 查询能快速找到数据?为什么索引能显著提升查询性能?答案就在于底层的索引结构——B+Tree。B+Tree 是 MySQL(特别是 InnoDB 引擎)最核心的数据结构,理解它的工作原理对于设计高性能数据库应用至关重要。本文将从基础概念出发,系统性地介绍 B-Tree 和 B+Tree 的原理、结构特点、操作复杂度以及在 MySQL 中的实际应用。 简介 什么是 B-Tree B-Tree(Balanced Tree)是一种自平衡的多路搜索树,由 Rudolf Bayer 和 Ed McCreight 于 1972 年提出。B-Tree 中的 "B" 代表 "Balanced"(平衡),而不是 "Binary"(二 …
Read More在多用户并发访问数据库时,如何保证数据的一致性和完整性?这就需要锁机制来协调不同事务之间的操作。MySQL 锁机制是数据库并发控制的核心,理解锁的工作原理对于设计高性能、高并发的数据库应用至关重要。本文将系统性地介绍 MySQL 中的各种锁类型、加锁机制、死锁问题以及实战优化技巧。 简介 什么是锁 **锁(Lock)**是数据库用来管理并发访问共享资源的一种机制。当多个事务同时访问同一份数据时,锁可以确保数据的一致性,防止出现脏读、不可重复读、幻读等并发问题。 在 MySQL 中,锁就像是一把保护数据的"门锁": 独占锁(排他锁):就像卧室的门,一次只能一个人进入 共享锁(读锁):就像图书馆的书,可以多人同时阅读,但不能同时修改 为 …
Read MoreMySQL 是支持多事务并发执行的。既然事务可以并发操作,这里就有一些问题:一个事务在写数据的时候,另一个事务要读这行数据,该怎么处理?一个事务在写数据,另一个数据也要写这行数据,又该怎么处理这个冲突?这就是并发事务所产生的一些问题。具体来说就是:脏读、不可重复读和幻读。 概念说明 脏读 脏读指的是读到了其他事务未提交的数据,未提交意味着这些数据可能会回滚,也就是可能最终不会存到数据库中,也就是不存在的数据。读到了并一定最终存在的数据,这就是脏读。 脏读最大的问题就是可能会读到不存在的数据。比如在上图中,事务B的更新数据被事务A读取,但是事务B回滚了,更新数据全部还原,也就是说事务A刚刚读到的数据并没有存在于数据库中。 从宏观来看, …
Read MoreSQL 优化在我们的调优类工作中可能占绝大多数,毕竟各种服务告警后,排查到最后会发现不是往日志写大对象写太多了,就是SQL查询太大、太慢,占内存太高了,还有一种可能是把好不容易SQL查出来的大对象,又写到了日志里。。。 前言 sql优化是一个大家都比较关注的热门话题,无论你在面试,还是工作中,都很有可能会遇到。 如果某天你负责的某个线上接口,出现了性能问题,需要做优化。那么你首先想到的很有可能是优化sql语句,因为它的改造成本相对于代码来说也要小得多。 那么,如何优化sql语句呢? 避免使用select * 很多时候,我们写sql语句时,为了方便,喜欢直接使用select *,一次性查出表中所有列的数据。 反例: 1select * …
Read More