| 数据库 | 描述 |
|---|---|
| mysql | |
| TiDB | |
| Aurora | |
| PolarDB | |
| TDSQL | |
| MongoDB | |
| OpenSearch | |
| clickhouse | |
| RocksDB |
2025年6月17日...大约 1 分钟
| 数据库 | 描述 |
|---|---|
| mysql | |
| TiDB | |
| Aurora | |
| PolarDB | |
| TDSQL | |
| MongoDB | |
| OpenSearch | |
| clickhouse | |
| RocksDB |
MySQL 集群的主从复制过程梳理成 3 个阶段:
具体详细过程如下:

undo log,因为这是更新操作,需要把被更新的列的旧值记下来,也就是要生成一条 undo log,undo log 会写入 Buffer Pool 中的 Undo 页面,不过在内存修改该 Undo 页面后,需要记录对应的 redo log。redo log,并存入redo log buffer里面。当事务提交时,将该语句生成的redo log按组为单位,写入redo log file。然后更新buffer pool中的数据页,将其插入flush 链表(如果不在其中),标记为脏页、记录当前redo log对应的lsn到该页的oldest_modification。这个时候更新就算完成了。为了减少磁盘 I/O,不会立即将脏页写入磁盘,后续由后台线程选择一个合适的时机将脏页写入到磁盘。(这就是 WAL 技术,MySQL 的写操作并不是立刻写到磁盘上,而是先写 redo 日志,然后在合适的时间再将修改的行数据写到磁盘上。但事务提交时必须要将redo log持久化)binlog,此时记录的 binlog 会被保存到 binlog cache,并没有刷新到硬盘上的 binlog 文件,在事务提交时才会统一将该事务运行过程中的所有 binlog 刷新到硬盘,然后进行第二阶段的提交。连续的内存空间,通过innodb_buffer_pool_size在服务器运行过程中调整buffer pool大小,默认为128MBFree Page(空闲页),此页未被使用,位于 Free 链表;Clean Page(干净页),此页已被使用,但是页面未发生修改,位于 LRU 链表。Dirty Page(脏页),表示此页已被使用且已经被修改,其数据和磁盘上的数据已经不一致。脏页上的数据写入磁盘后,内存数据和磁盘数据一致,那么该页就变成了干净页。脏页同时存在于LRU链表和Flush链表。提高读性能: 读取数据的时候,先从buffer pool LRU链表(干净页)读取数据,如果没有从磁盘读取并把它相邻的数据页一并加载进来。提高写性能: 更新数据的时候,不需要每次都要写入磁盘,而是将 Buffer Pool 对应的缓存页标记为脏页,然后再由后台线程将脏页写入到磁盘explain 列名 |
描述 |
|---|---|
| id | 在一个大的查询语句中每个SELECT关键字都对应一个唯一的id |
select_type |
SELECT关键字对应的那个查询的类型 |
| table | 表名 |
| partitions | 匹配的分区信息 |
type |
针对单表的访问方法 |
| possible_keys | 可能用到的索引 |
| key | 实际上使用的索引 |
key_len |
实际使用到的索引长度 |
| ref | 当使用索引列等值查询时,与索引列进行等值匹配的对象信息 |
| rows | 预估的需要读取的记录条数 |
| filtered | 某个表经过搜索条件过滤后剩余记录条数的百分比 |
Extra |
一些额外的信息 |

根据驱动表中的记录在被驱动表中无匹配时,是否加入到最后的结果集分为:
INNER JOIN:不加入结果集根据驱动表选择分为:
LEFT JOIN:选取左侧的表为驱动表RIGHT JOIN:选取右侧的表为驱动表多个索引来完成一次查询的执行方法type 会显示index merge索引不止存在内存中,还要写到磁盘上[!TIP] 索引不止存在内存中,还要写到磁盘上。N 叉树(B+树)由于在读写上的性能优点,以及适配磁盘的访问模式
若干个区组成的区(extent): 连续的64个页就是一个区extent,默认占用1MB空间大小。
为什么要有区:同层的索引页之间以链表组织,物理距离可能会比较远,这样就会引起随机IO。使用区可以保证64个页的连续)段(segment):
零散的页以及一些完整的区的集合碎片区(fragment):