我们在相当大的服务器(2 个四核 Xeon,24GB RAM,RAID10 中的 2.5 英寸 10k 磁盘)上运行一个中等大小(350GB)的数据库,其中包含一些相当大的表(几亿行,50GB),并且正在获得一些非常慢的插入(例如,单行的简单插入需要 90 秒!)。
我们的 innodb_buffer_pool_size 设置为 400MB,这对于这种设置来说通常太低了。但是,我们的托管服务提供商建议在 ZFS 上运行时这无关紧要。他说得对吗?
不,他不对。如果一个块不在 InnoDB 缓存中,那么它必须被获取,这意味着它要么来自磁盘,要么来自 ZFS 缓存,此时它的两个副本存在于主内存中。如果您使用该块,它将从 InnoDB 缓存中出来。如果您写入该块,它将从 InnoDB 缓存转到磁盘。在这种情况下,ZFS 缓存只是一个无助的旁观者。
但是,如果您的问题是INSERT
性能问题,则不太可能与此相关,除非您的系统负载非常重……是吗?从文档:
如果索引记录应该插入到非唯一的二级索引中,InnoDB 会检查二级索引页是否在缓冲池中。如果是这种情况,InnoDB 会直接插入到索引页。如果在缓冲池中找不到索引页,InnoDB 会将记录插入到特殊的插入缓冲区结构中。插入缓冲区保持得非常小,以至于它完全适合缓冲池,并且插入可以非常快地完成。
定期将插入缓冲区合并到数据库中的二级索引树中。通常可以将多个插入合并到索引树的同一页中,从而节省磁盘 I/O 操作。据测量,插入缓冲区最多可以将插入表的速度提高 15 倍。
在提交插入事务后,插入缓冲区合并可能会继续发生。事实上,它可能会在服务器关闭并重新启动后继续发生(请参阅第 13.2.6.2 节,“强制 InnoDB 恢复”)。
当必须更新许多二级索引并且插入了许多行时,插入缓冲区合并可能需要几个小时
SHOW ENGINE INNODB STATUS应该准确地显示数据库正在等待什么。也看看strace 是否可以提供帮助。
归档时间: |
|
查看次数: |
1725 次 |
最近记录: |