25

MySQL 5.0 5.1 下InnoDB的预热方法

之前在做一个项目的MySQL数据库极限压测, 有部分场景是涉及到MySQL重启的,而这个项目使用的是InnoDB存储引擎。

重启完毕后,一开始十几分钟的性能是非常差的,原因是因为InnoDB有innodb buffer pool(简称ibf)的概念

和innodb buffer pool相关的参数innodb_buffer_pool_size,size越大,可以放到内存的数据越多,而大多数的项目都会有热点数据的存在,当热点数据经过LRU算法进入到buffer pool之后,读磁盘的次数减少,读的都是内存,速度是最快的

问题来了,数据库一重启,热点数据都被清空,bf里面都是空的.等待app的sql请求过来让bf填满数据是一个方法,但30分钟内很难把热点数据都装载进来.

这个时候,我们可以采取人工预热的办法来让bf满足我们的需求

继续阅读全文

22

MyISAM和InnoDB的不同优化

key_buffer_size – 这对MyISAM表来说非常重要。如果只是使用MyISAM表,可以把它设置为可用内存的 30-40%。合理的值取决于索引大小、数据量以及负载。
记住,MyISAM表会使用操作系统的缓存来缓存数据,因此需要留出部分内存给它们,很多情况下数据比索引大多了。尽管如此,需要总是检查是否所有的 key_buffer 都被利用了。
.MYI 文件只有 1GB,而 key_buffer 却设置为 4GB 的情况是非常少的。这么做太浪费了。如果你很少使用MyISAM表,那么也保留低于 16-32MB 的 key_buffer_size 以适应给予磁盘的临时表索引所需。

继续阅读全文

22

“ERROR 1235 (42000): skip-innodb is defined”的误导

发现监控数据库的my.cnf中的关于Innodb的配置都保持默认状态,而之前只运行cacti倒是没有什么影响,它的表都是MyISAM的。因为前段采用了zabbix监控,而它的表都采用Innodb的表结构。其实,很多参数都可以在线调整,之后将变化的添加到my.cnf即可,无需修改my.cnf再重启mysqld,因为zabbix的信息收集量不小,导致binlog增长很快,磁盘容量报警,之前expire_log_days又设置为0。我觉得监控系统没必要开启binlog日志功能,所以想将log-bin注释掉不记录二进制日志,所以,必须要重启mysqld。在改动的这些参数里面,我调整了redo log的大小,将默认的10M增大到256M,也就是这么一改,重启后,扑哧让我惆怅了好一会。

继续阅读全文

30

InnoDB的多版本一致性读的实现

InnoDB是支持MVCC多版本一致性读的,因此和其他实现了MVCC的系统如Oracle,PostgreSQL一样,读不会阻塞写,写也不会阻塞读。虽然同样是MVCC,各家的实现是不太一样的。Oracle通过在block头部的事务列表,和记录中的锁标志位,加上回滚段,个人认为实现上是最优雅的方式。 而PostgreSQL则更是将多个版本的数据都放在表中,而没有单独的回滚段,导致的一个结果是回滚非常快,却付出了查询性能降低的代价。

继续阅读全文

10

InnoDB的Master Thread调度流程

解释一下“插入缓冲”(Insert Buffer):InnoDB为了避免更新数据时更新索引损失太多性能,使用了这种称为Insert Buffer的方法来缓冲索引更新,对于非聚集索引(主键索引)、唯一索引的修改,不是每次都直接插入索引页,而是先判断要更新的这一页在不在内存中,如果不在则存入Insert Buffer,按照Master Thread的调度规则来合并非唯一索引和索引页中的叶子结点,这样经常能减少更新索引的代价。为什么要求是非唯一索引(排除主键索引和唯一索引)呢?因为唯一索引要检查记录是不是存在,所以必须把修改的记录影响的索引页读出来才知道是不是唯一,这样Insert Buffer就没意义了,反正要读出来,所以只对非唯一索引有效。

继续阅读全文

27

InnoDB Adaptive Flush

从 InnoDB 了解到,plugin 1.0.4 开始,提供了一个新的脏数据刷新机制,被称为: innodb_adaptive_flushing 。由于之前在各种性能测试以及线上环境的性能监控中时常遇到当 InnoDB 在进行大批量 Dirty Page 的 Flush 过程中,会对系统的整体性能造成不小的影响,所以个人对这个新机制比较感兴趣,仔细分析了下这个机制到底改善了些什么内容。

继续阅读全文