transaction (1)—mysql进阶(五十七)
前面说了当设置的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
+----+--------+---------+
相关文章