如何优化混合 InnoDB 和 MyISAM 表空间的 MySQL 服务器的 my.cnf?

use*_*793 6 mysql innodb myisam my.cnf

我有一个数据库,由于一些问题,我需要将一些表从 MyISAM 转换为 InnoDB。

我基本上是这样做的:

set sql_log_bin = 0; 

set sql_mode = 'STRICT_ALL_TABLES';

ALTER TABLE  `table1` ENGINE = INNODB;

ALTER TABLE  `table2` ENGINE = INNODB;

ALTER TABLE  `table3` ENGINE = INNODB;

ALTER TABLE  `table4` ENGINE = INNODB;

ALTER TABLE  `table5` ENGINE = INNODB;

ALTER TABLE  `table6` ENGINE = INNODB;
Run Code Online (Sandbox Code Playgroud)

它工作正常,但据我所知,我现在应该重新配置 my.cnf 然后重新启动 mysql 服务器,对吗?

如果服务器同时包含 MyISAM 和 InnoDB 表,我应该如何调整 my.cnf 文件?

Rol*_*DBA 5

为了调整 InnoDB 和 MyISAM 的 RAM,您必须知道每个存储引擎缓存的内容。

  • MyISAM 仅缓存索引
  • InnoDB缓存数据和索引

有两个查询将帮助您为其缓存生成正确的大小。@DTest 在他的答案中命名了这些缓存(顺便说一句@DTest +1)。

要调整 MyISAM Ke​​y Cache 的大小,请根据以下内容设置key_buffer_size :

SELECT CONCAT(ROUND(KBS/POWER(1024, 
IF(PowerOf1024<0,0,IF(PowerOf1024>3,0,PowerOf1024)))+0.4999), 
SUBSTR(' KMG',IF(PowerOf1024<0,0, 
IF(PowerOf1024>3,0,PowerOf1024))+1,1)) 
recommended_key_buffer_size FROM 
(SELECT LEAST(POWER(2,32),KBS1) KBS 
FROM (SELECT SUM(index_length) KBS1 
FROM information_schema.tables 
WHERE engine='MyISAM' AND 
table_schema NOT IN ('information_schema','mysql')) AA ) A, 
(SELECT 2 PowerOf1024) B; 
Run Code Online (Sandbox Code Playgroud)

要调整 InnoDB 缓冲池的大小,请根据以下内容设置innodb_buffer_pool_size :

SELECT CONCAT(ROUND(KBS/POWER(1024, 
IF(PowerOf1024<0,0,IF(PowerOf1024>3,0,PowerOf1024)))+0.49999), 
SUBSTR(' KMG',IF(PowerOf1024<0,0, 
IF(PowerOf1024>3,0,PowerOf1024))+1,1)) recommended_innodb_buffer_pool_size 
FROM (SELECT SUM(data_length+index_length) KBS FROM information_schema.tables 
WHERE engine='InnoDB') A, 
(SELECT 2 PowerOf1024) B; 
Run Code Online (Sandbox Code Playgroud)

@DTest提到了另一个重要的事情:MySQL的版本。这对于 InnoDB 很重要,因为MySQL 5.5 现在可以选择强制 InnoDB 使用更多 CPUMySQL 5.1.38 引入了这些选项,但当且仅当您修补了 InnoDB 插件时才可用。不要尝试通过合并插件来挽救 MySQL 5.1,只需升级到 MySQL 5.5。

您可以阅读以下一些内容:


Der*_*ney 4

InnoDB 最重要的变量之一innodb_buffer_pool_size. 这是仅为 InnoDB 加载表空间信息而分配的内存量。

由于您混合使用 MyISAM 和 InnoDB,因此您需要在key_buffer_size(对于 MyISAM 索引)和innodb_buffer_pool_size(对于 InnoDB 读取)之间找到良好的平衡。

一般来说,如果可能的话,您希望将整个数据放入内存中,因为磁盘读取(显然)非常昂贵。

您没有提到您正在运行哪个 MySQL 版本,但我建议您阅读相应版本的文档来调整 InnoDB 以获取更多详细信息。


归档时间:

查看次数:

3107 次

最近记录:

13 年,8 月 前