MariaDB社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2555|回复: 7
打印 上一主题 下一主题

innodb插入缓存为什么没有效果

[复制链接]
跳转到指定楼层
1#
发表于 2012-6-5 11:26:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享 分享淘帖 顶1 踩
2#
发表于 2012-6-5 16:21:27 | 只看该作者
你的表结构?如何插入的?

参考:
http://www.mysqlpub.com/thread-31119-1-1.html
3#
 楼主| 发表于 2012-6-5 18:25:07 | 只看该作者
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 (?,?,?,?,?)
4#
发表于 2012-6-6 09:44:58 | 只看该作者
本帖最后由 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








5#
发表于 2012-6-6 10:11:18 | 只看该作者
本帖最后由 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 操
                作进行。
               
6#
 楼主| 发表于 2012-6-7 17:12:43 | 只看该作者
多谢hm3030大侠的回复
参数  | innodb_change_buffering      | all        |  (这个参数没太明白是什么意思)
insert buffer的大小MySQL技术内幕中说最大可以占用1/2缓冲池,| innodb_buffer_pool_size      | 4294967296 |
缓存池4G,为何insert buffer才占用这么点,还要配置什么吗

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

可插入缓冲是对非聚集索引的缓存呀,我上表中有2个非聚集索引,主键大致是顺序的,但另外两个非聚集索引肯定是非顺序的,这样插入缓存的合并就很有必要的
7#
发表于 2012-6-8 13:42:52 | 只看该作者
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/
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|小黑屋|手机版|MariaDB社区 ( 京ICP备07012489号    |
业务联系: QQ:48474881; 邮箱: 48474881@qq.com; 电话:13911732319
声明:本站部分文章是网友转载,若未经作者同意或署名有误,请联系网站管理员。

GMT+8, 2024-11-1 14:27 , Processed in 0.059886 second(s), 18 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表