我无法找到有关我的问题的任何信息。这是更多的理论问题。 例如,我有表关键字。
CREATE TABLE IF NOT EXISTS `keywords` (
`kid` int(11) unsigned NOT NULL AUTO_INCREMENT,
`language_id` int(11) NOT NULL,
`keyword` varchar(120) NOT NULL,
PRIMARY KEY (`kid`),
UNIQUE KEY `custom_idx` (`language_id`,`keyword`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
我的服务器有1GB的可用RAM内存。我的表格中有数百万行,而 custom_idx 的大小超过1GB。 索引无法插入RAM内存。 mysql会做什么?只有这部分索引会存储在内存中吗?这会破坏BTREE / Clustered索引的性能吗?
另外,如果我的索引的大小不适合 innodb_buffer_pool_size 限制,会发生什么?
复制是否是巨大的InnoDB数据库的答案,其中索引无法容纳到RAM内存中?
答案 0 :(得分:1)
InnoDB使用InnoDB缓冲池(其大小使用innodb_buffer_pool_size
变量控制)来缓存许多不同的数据结构,包括行数据和索引。如果您的数据集对于此缓冲池来说太大,MySQL当然会交换。效果有多大,你必须衡量。它可以是“几乎不可察觉”和“查询需要更长时间”的任何内容。
复制肯定不是解决方案。复制仅将您的数据同步到另一台计算机,并且它们不允许架构差异(例如,如果您考虑到这些,则不同的索引)。如果其他机器同样装备不足,那么您将使用两个而不是一个慢速数据库服务器。您应该在第一台服务器上安装更多内存。
答案 1 :(得分:0)
InnoDB尽可能多地将数据加载到内存中。如果它不适合内存 - 嗯,它不会加载它。这有两个副作用。首先,如果它需要查找不在RAM中的数据,则必须从磁盘加载它。但它首先需要将任何已更改的数据(即内存中)刷新回磁盘。此外,如果任何唯一索引不能适合内存,那么当您尝试插入/更新行时,应从磁盘读取索引;这是第一个值得注意的性能问题之一 - 当唯一索引无法适应内存时缓慢插入,因为它是应该读取所有索引值的少数条件之一。
不是复制,但分片/分区是将数据集放入不同服务器的RAM中的方法。