zoukankan      html  css  js  c++  java
  • InnoDB杂记

    一.InnoDB写数据流程(猜想)
     
    myisam是将索引放入内存缓存(Key Cache,大小有key_buffer_size设置)
    innodb是将索引和数据文件都放入内存缓存池(Buffer Pool,简称BP,大小由innodb_buffer_pool_size设置,log buffer大小由innodb_log_buffer_size决定)
     
    如果一个事务过来后比如要将A=3修改成A=4,InnoDB是如何处理的呢?
     
    1.A=3的时候记录到undolog
    2.A=4的时候记录到redolog
     
    undolog保存在表共享空间中
    redolog即ib_logfile*
     
     
    事务提交过程:
    1.如果BP中有没有A=3的这条数据,InnoDB会将数据从磁盘提取出来放入BP.
    2.记录A=3到undolog
    3.修改A=4
    4.记录A=4到redolog(log buffer)
    5.提交事务
    5.将redolog持久化,log buffer将之前在内存中redolog写入日志文件(即ib_logfile*),返回给client事务已经提交
     
    7.这个时候PB中的数据已经和磁盘中的数据不一样了,脏页产生了,InnoDB根据一定算法决定开始刷盘.
    8.数据页从PB写入double write buffer(双写缓存,也在表共享空间内)
    9.double write buffer再将数据页写入到ibd文件中
     
    *如果到执行完4后,不提交事务,执行rollback,那么系统将从undolog中取出数据替换,而因为redolog是一个连续分配的空间,为保证顺序IO,redolog不会被删除掉
    *如果innodb在操作8的过程中出现问题,那么可以从redolog中恢复
    *如果在操作9的时候出现了问题,innodb可以从double write buffer取出好的页写入idb(这可能就是为什么double write buffer不在内存中,而在文件中)
     
     
    二.如何设置合适的innodb_buffer_pool_size
    计算Innodb_buffer_pool_pages_data(包含数据的页数)/Innodb_buffer_pool_pages_total(总页数)*100%
    当结果 > 95% 则增加 innodb_buffer_pool_size, 建议使用物理内存的 75%
    当结果 < 95% 则减少 innodb_buffer_pool_size, 
    建议设置大小为: Innodb_buffer_pool_pages_data* Innodb_page_size(页大小) * 1.05 / (1024*1024*1024)
  • 相关阅读:
    uva 10369 Arctic Network
    uvalive 5834 Genghis Khan The Conqueror
    uvalive 4848 Tour Belt
    uvalive 4960 Sensor Network
    codeforces 798c Mike And Gcd Problem
    codeforces 796c Bank Hacking
    codeforces 768c Jon Snow And His Favourite Number
    hdu 1114 Piggy-Bank
    poj 1276 Cash Machine
    bzoj 2423 最长公共子序列
  • 原文地址:https://www.cnblogs.com/itfenqing/p/6156085.html
Copyright © 2011-2022 走看看