2012-08-26 49 views
0

我找不到任何有关我的问题的信息。这是更理论的问题。例如,我有表关键字交换MySQL InnoDB索引

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数据库的答案吗?

+0

我检查了六视图如何做MYISAM:单独的文件和索引。这个“egnine”可以在InnoDB中完成,但是我并没有在低层次上进行检查,所以我不知道你的问题的答案,但是:从我在这些大型数据库上的经验来看,数据库,以“O”开头,以“racle”结尾:)对我来说,100万是极限:在其他数据库之下的那个MySQL下。 – 2012-08-26 09:26:07

回答

1

InnoDB使用InnoDB缓冲池(其大小由innodb_buffer_pool_size变量控制)来缓存许多不同的数据结构,包括行数据和索引。如果你的数据集对于这个缓冲池太大,MySQL当然会交换。如何戏剧性的影响,你必须测量。它可以是“几乎不显眼”和“查询花费1000倍以上”之间的任何内容。

复制绝对不是解决方案。复制只会将您的数据同步到另一台计算机,并且它不允许在它们之间存在模式差异(例如,如果您有此考虑,则使用不同的索引)。如果那台另外的机器同样装备不足,那么你会得到两台而不是一台慢速的数据库服务器。你应该在第一台服务器上安装更多的内存。

0

InnoDB尽可能多地将数据加载到内存中。如果它不适合内存 - 呃,它不会加载它。这有2个副作用。首先,如果它需要查找不在RAM中的数据,则必须从磁盘加载数据。但它首先需要将任何已更改的数据(即内存中的数据)刷新到磁盘。另外,如果任何唯一索引不能适应内存,那么当您尝试插入/更新行时,应该从磁盘读取索引;这是第一个显而易见的性能问题之一 - 当唯一索引无法放入内存时缓慢插入,因为它是应该读取所​​有索引值的少数条件之一。

不复制,但分片/分区是适合不同服务器的RAM中的数据集的方式。