MariaDB社区

标题: innodb插入缓存为什么没有效果 [打印本页]

作者: win1027    时间: 2012-6-5 11:26
标题: innodb插入缓存为什么没有效果
MySQL技术内幕中说:  插入缓冲的使用需要满足以下两个条件:
索引是辅助索引。
索引不是唯一的。
实践中我有张表满足了以上两个条件,但是我批量插入了几百万的数据时,用show engine innodb status\G; 查看:
INSERT BUFFER AND ADAPTIVE HASH INDEX
-------------------------------------
Ibuf: size 1, free list len 5, seg size 7, 0 merges
merged operations:
insert 0, delete mark 0, delete 0
discarded operations:
insert 0, delete mark 0, delete 0
Hash table size 4425293, node heap has 6 buffer(s)
1502.53 hash searches/s, 791.55 non-hash searches/s
显示几乎都是0,为什么,是还需要修改什么配置项吗?
mysql版本为5.5.13

作者: kider    时间: 2012-6-5 16:21
你的表结构?如何插入的?

参考:
http://www.mysqlpub.com/thread-31119-1-1.html
作者: win1027    时间: 2012-6-5 18:25
CREATE TABLE `T_Phonebook` (
          `username` VARCHAR(64) NOT NULL,
          `contactPhone` VARCHAR(32) NOT NULL,
          `contactName` VARCHAR(64) DEFAULT NULL,
          `createTime` CHAR(15) NOT NULL,
          `countryCode` VARCHAR(8) DEFAULT NULL,
          `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
          PRIMARY KEY (`id`,`username`),
          KEY `T_Phonebook_contactphone_idx` (`contactPhone`),
          KEY `T_Phonebook_username_idx` (`username`)
        ) ENGINE=INNODB DEFAULT CHARSET=utf8
INSERT INTO T_Phonebook (username,contactphone,contactName,createTime,countryCode) VALUES (?,?,?,?,?)
作者: hm3030    时间: 2012-6-6 09:44
本帖最后由 hm3030 于 2012-6-6 10:02 编辑

该参数innodb_change_buffering 你设置为?
从你贴出的信息看,insert buffer是使用了的(7*16K),至于merges等这些为0,从你给出的条件看,你是批量导入的,说明基本都是顺序IO。MySQL判断不需要meger等。
这里跟你解析下meger,它分:
            1.主动meger[innodb主线程定期完成,用户线程无感知]
            2.被动meger[用户线程完成,用户能感受到meger操作带来的性能影响]
主动meger:
    原理:主动meger通过innodb主线程(svr_master_thread)判断:若过去1s之内发生的I/O小于系统I/O能力的5%,
               则主动进行一次insert buffer的meger操作。meger的页面数为系统I/O能力的5%,读取采用async io模式。
               每10s,必定触发一次insert buffer meger操作。meger的页面数仍旧为系统 I/O能力的5%。
    步骤:
             1.主线程发出async io请求,async读取需要被meger的索引页面
             2.I/O handler 线程,在接受到完成的async I/O之后,进行merger









作者: hm3030    时间: 2012-6-6 10:11
本帖最后由 hm3030 于 2012-6-6 10:13 编辑

被动meger:
      情况一:
               insert操作,导致页面空间不足,需要分裂(split)。由于insert buffer只针对单个页面,不能buffer page split[页已经
               在内存里],因此引起页面的被动meger。同理,update操作导致页面空间不足;purge导致页面为空等。总之:若
               当前操作引起页面split or meger,那么就会导致被动meger。
      情况二:
               insert操作,由于其它各种原因,insert buffer优化返回false,需要真正读取page时,要进行被动meger。与一不同
               的是,页 在disk上,需要读取到内存里。
       情况三:
                在进行insert buffer操作,发现insert buffer太大,需要压缩insert buffer,这时需要强制被动meger,不允许 insert 操
                作进行。
               
作者: win1027    时间: 2012-6-7 17:12
多谢hm3030大侠的回复
参数  | innodb_change_buffering      | all        |  (这个参数没太明白是什么意思)
insert buffer的大小MySQL技术内幕中说最大可以占用1/2缓冲池,| innodb_buffer_pool_size      | 4294967296 |
缓存池4G,为何insert buffer才占用这么点,还要配置什么吗

hm3030说:
    从你给出的条件看,你是批量导入的,说明基本都是顺序IO。MySQL判断不需要meger等。

可插入缓冲是对非聚集索引的缓存呀,我上表中有2个非聚集索引,主键大致是顺序的,但另外两个非聚集索引肯定是非顺序的,这样插入缓存的合并就很有必要的
作者: hm3030    时间: 2012-6-8 13:42
all
The default value: buffer inserts, delete-marking operations, and purges。

我看你的buffer pool size为4G.而你导入的就几百万,data都cache在buffer pool里面,这是肯定不会用到insert buffer
为了加深理解,给你几个链接,好好研究【注 文章里面的relevant page not in the  buffer pool

http://blogs.innodb.com/wp/2010/ ... b-change-buffering/




欢迎光临 MariaDB社区 (http://123.56.88.72/) Powered by Discuz! X3.2