数据库 | 描述 |
---|---|
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)
: