#努力第五天#row_format:dynamic 大记录 只存20字节指针 指向行溢出页
compact:先存768 再存20字节 指向溢出页
页里的记录是怎么关联的呢???
单向链表,只有next指针
怎样标识一条记录 heap number 表示插入记录的顺序 是个递增的值
如果重新整理呢????
两个伪记录0 1
heap number存放在记录的record header中
show engine innodb status\G
如果heap number等于1 锁住页里逻辑最大的记录
表里只有一条记录1
隔离级别设置可重复读
select * from aa where a>1 for update; 这里会锁住heap number的
innodb缓存池
innodb buffer pool
缓冲池大小与性能的关系如图1
内存减少10% 性能下降60%
缓冲池里有一个一个页 (会有区和段吗???)
读的时候先把页到缓冲池
如果写呢????
如果用ssd盘呢???(用sysbench工具测试)
缓冲池存放的内容
数据页
索引页
change buffer
innodb_buffer_pool_instances 多个缓冲池 可以配置成cpu的数量 把热点打散 并发更快
innodb_buffer_pool_stats pool_id 第几个buffer_pool(performance_schema)
信息多的时候可以用less
buffer pool
free list
LRU List 活跃的页,
flush list如果页第一次修改 就会放到这里(存放页的指针)根据oldest_lsn进行排序
buffer pool里的list说明 如图2和图3
select * from innodb_buffer_pool_stats
database_pages表示lru list页
innodb_buffer_page_lru表里page_number字段
newest_modification (space pageno)最近修改的lsn
oldest_modification (space pageno)第一次修改的lsn
5.7版本可以在线调整缓冲池大小
LRU List是怎么进行管理的
最近最少使用算法
midpoint LRU
3/8 innodb_old_blocks_pct
新读取的页放到midpoint 如果后面不被读取到 就到old里 慢慢的就被淘汰
缓冲池污染 bp污染(一个页有很多条记录 记录是一条一条读取的 扫描的话 要读很多次页)
innodb_old_blocks_time设置一秒钟 超过一秒钟才会放到new 不会立刻放到new
为了防止全表扫描
缓冲池里的页是一条记录一条记录读的吗??? 页多读取多次??? 但是磁盘里的页读取到内存是一次性读,按16k读。
young 从old到new
缓冲池预热
使得数据库快速恢复到运行状态
数据库重启
数据库服务宕机
预热方法(这种方法不高效,并不一定能把热点数据加载进来)
select count(1) from table force index(primary)
select count(1)from index
5.6
先把buffer pool数据dump出来 启动的时候加载(dump出来是什么呢???)space和pageno
innodb_buffer_pool_dump_now dump lru的
innodb_buffer_pool_filename 缓冲池文件ib_buffer_pool
5.7
innodb_buffer_pool_dump_pct只dump一部分