MySQL数据库量化InnoDB group commit的效果

前几天有位开发的同学问了个问题,InnoDB的group commit效果如何?之前说好了回头给看下,结果险些拖过年。

Group commit背景
         InnoDB的redo log的group commit历史比较悠久了(有别于binlog的group commit)。如果设置为1,每次事务提交都至少需要写一次redolog。这对IOPS冲击严重,尤其是在HDD上,直接成为性能瓶颈。
Group commit的基本想法是将多个并发线程对redo的fsync操作合并成1个。具体的过程可以参照这篇

Group commit的效果

         其实效果好不好全看具体场景。这里我们先给出一种直观看结果的方法,然后再举例子分析。

1)       数据
简单表结构

MySQL数据库5.6 explain update一个疑似bug

5.6 的新增特性,允许对DML语句做explain。这下大家高兴了,碰到复杂更新语句(且还造成慢查询)要自己手动改成select语句的日子终于到头了。

饶有兴致的试用了一把,总体感觉不错,不过发现一个bug。

复现    

mysql> create table tb(id int primary key , c int);
Query OK, 0 rows affected (0.01 sec)mysql> insert into tb values(1,1);
Query OK, 1 row affected (0.00 sec)mysql> insert into tb values(2,2);
Query OK, 1 row affected (0.00 sec)mysql> explain select * from tb where id=1;
+—-+————-+——-+——-+—————+———+———+——-+——+——-+
| id | select_type | table | type  | possible_keys | key     | key_len | ref   | rows | Extra |
+—-+————-+——-+——-+—————+———+———+——-+——+——-+
|  1 | SIMPLE      | tb    | const | PRIMARY       | PRIMARY | 4       | const |    1 | NULL |
+—-+————-+——-+——-+—————+———+———+——-+——+——-+
1 row in set (0.00 sec)

mysql> explain update tb   tb set c=2 where id=1;
+—-+————-+——-+——-+—————+———+———+——+——+————-+
| id | select_type | table | type  | possible_keys | key     | key_len | ref  | rows | Extra       |
+—-+————-+——-+——-+—————+———+———+——+——+————-+
|  1 | SIMPLE      | tb    | range | PRIMARY       | PRIMARY | 4       | NULL |    1 | Using where |
+—-+————-+——-+

 这里我们看到,在explain update的结果中,type=range,并且Extra是Using where。

FFLIB之FFXML:极简化TinyXml 读取

摘要:

XML是结构化的标记语言,经常被用来做配置文件。由于XML的具有非常强的自描述属性,使用XML的配置文件往往直观易懂。C++中解析XML已经有一些非常成熟的类库可以使用,TinyXml是最受欢迎的解析类库之一。尽管TinyXml已经已经封装了解析细节,但是解析、遍历Xml仍然是稍显繁琐。FFXML针对如下需求对TinyXml做了轻量封装:

  • 只把XML当成配置文件,也就是说,只有对XML的读取操作,在我日工作中,都是用XML当做纯配置文件,把XML当成序列化文件或数据文件的情况少之又少。
  • XML配置文件不会太大,我们假设限制在几千行以内,通常XML配置文件不需要那么大,在这种需求下,的XML的读取效率不是问题,易用性会被放到首位,必须非常容易获取xml中的内容。