【问题标题】:MySQL InnoDB Index in swap交换中的 MySQL InnoDB 索引
【发布时间】:2012-08-26 09:08:38
【问题描述】:

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

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 数据库的解决方案吗?

【问题讨论】:

  • 我已经在 hexa 视图中检查了如何执行 MYISAM:单独的文件和索引。那个“egnine”可以在 InnoDB 中完成,但我没有在低级别检查过如何做,所以我不知道你的问题的答案,但是:根据我在那些大型数据库上的经验,其他的要好得多DB,以“O”开头,以“racle”结尾:) 对我来说,100 万是极限:在另一个 db 之上的那个 mysql 下。

标签: mysql replication innodb


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2015-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-23
      • 2017-12-03
      • 2017-06-11
      • 2014-01-12
      相关资源
      最近更新 更多