0

我找不到任何关于我的问题的信息。这是一个更理论的问题。例如,我有表关键字

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/聚集索引的性能吗?

另外,如果我的索引大小不能适应innodb_buffer_pool_size限制,会发生什么?

复制是索引无法放入 RAM 内存的巨大 InnoDB 数据库的答案吗?

4

2 回答 2

1

InnoDB 使用 InnoDB 缓冲池(其大小由innodb_buffer_pool_size变量控制)来缓存很多不同的数据结构,包括行数据和索引。如果你的数据集对于这个缓冲池来说太大了,MySQL当然会交换。效果有多大,你必须衡量。它可以是“几乎不引人注意”和“查询时间延长 1000 倍”之间的任何内容。

复制肯定不是解决方案。复制只会将您的数据同步到另一台机器,并且不允许它们之间存在模式差异(例如,不同的索引,如果您有这个想法的话)。如果另一台机器同样装备不足,您将使用两台而不是一台慢速数据库服务器。您可能应该在第一台服务器中安装更多内存。

于 2012-08-26T13:18:39.403 回答
0

InnoDB 将尽可能多的数据加载到内存中。如果它不适合内存 - 好吧,它不会加载它。这有两个副作用。首先,如果它需要查找不在 RAM 中的数据,它必须从磁盘加载它。但它首先需要将任何更改的数据刷新回磁盘,即内存中。此外,如果任何唯一索引无法放入内存,那么当您尝试插入/更新行时,应从磁盘读取索引;这是第一个值得注意的性能问题之一 - 当唯一索引无法放入内存时插入速度很慢,因为它是应该读取所​​有索引值的少数情况之一。

不是复制,而是分片/分区是将数据集放入不同服务器的 RAM 的方法。

于 2012-08-29T12:12:47.850 回答