transaction (1)—mysql进阶(五十七)

2023-02-06 00:00:00 数据 操作 事务 磁盘 转账

前面说了当设置的buffer_pool_size在1个G内,则不管如何设置,buffer_pool_instances都是一个,当在1个G以上,mysql才支持多个instances设置,每个都有自己独立的链表,多线程的情况下互不干扰运行。

Show engine innodb status\G

磁盘太慢,内存很有必要,buffer_pool在mysql启动的时候会向系统申请连续的内存空间,buffer_pool_instances 和buffer_pool_chunk_size这几个参数是倍数关系,设置的时候,mysql为了防止浪费内存出现碎片,自动会平衡他们的参数。

为了方便管理,里面有free链表,flush链表,lru链表,

Free链表就是申请空闲的缓存页,flush链表就是修改之后的数据,需要更新到磁盘上的,lru链表又分为young区域和old区域,这里面的数据代表后 使用数据。Select查询过程是先从磁盘吧数据放入buffer pool缓存页,有自己的控制块,吧控制块放入old区域,如果在buffer_old _block_time,初次和后一次访问超过这个时间,则会吧数据放入young,这样可以解决全表查询数据太大导致热数据被内存释放,也可以防止预读。

链表里面数据那么多怎么查询呢,通过hash表来查询,key是表空间id+页号,value就是缓存页。

为什么要事务?

我们先创建一个表

mysql> create table account(
    -> id int not null auto_increment comment '自增id',
    -> name varchar(100) comment '客户名称',
    -> balance int comment '余额',
    -> primary key (id
    -> )engine=Innodb charset=utf8;
Query OK, 0 rows affected (0.04 sec) 
+----+--------+---------
| id | name   | balance |
+----+--------+---------
|  1 | 狗       |      11 
|  2 | 猫       |       2 
+----+--------+---------+

相关文章