对于768M RAM服务器在my.cnf中是617M配置好还是不好?

Ali*_*eza 1 mysql mysql-5 my.cnf

我有一个写入密集型的网络应用程序,我买了一个 768M RAM 的 VDS

  • 这是 my.cnf 适合我的目的吗?

我将 bulk_insert_buffer_size 指定为 126M,其他一些参数如下:

[mysqld]
bulk_insert_buffer_size=126M
set-variable = max_connections=500
safe-show-database
max_user_connections=200
key_buffer_size = 16M
query_cache_size = 50M
tmp_table_size = 50M
max_heap_table_size  = 200M
thread_cache_size = 4
table_cache = 80
thread_concurrency = 8
innodb_buffer_pool_size = 100M
innodb_log_file_size = 25M
query_cache_limit = 50M
innodb_flush_log_at_trx_commit = 2
Run Code Online (Sandbox Code Playgroud)

Rol*_*DBA 5

这取决于 MySQL 数据的数量以及您使用的存储引擎

当涉及到 MyISAM 和 InnoDB 时,它们的缓存不同。我在 2011 年 4 月 14 日写了一篇关于此的帖子

由于您的机器只有 768M 的 RAM,因此您必须根据您使用最多的存储引擎来做一个很好的平衡。

所有 MyISAM

请运行此查询

查询#1

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)

此查询将告诉您数据需要多大的 MyISAM 密钥缓冲区(以 MB 为单位)。当然,安装的 RAM 数量优先,因此请使用常识。您应该运行此查询:

查询#2

SELECT
    DataSize/POWER(1024,2) DataMB,
    IndexSize/POWER(1024,2) IndexMB,
    (DataSize/IndexSize) DataToIdexRatio
FROM
(
    SELECT SUM(data_length) DataSize,SUM(index_length) IndexSize
    FROM information_schema.tables
    WHERE engine='MyISAM' AND
    table_schema NOT IN ('information_schema','mysql')
) A;
Run Code Online (Sandbox Code Playgroud)

如果 DataToIndexRatio 小于 3,请查看所有索引。您的索引可能太大或太多。如果您删除所有未使用的索引,这将提高 DataToIndexRatio,然后您可以运行查询 #1,并获得较小的建议。再次使用常识,因为您只有 768M。我个人不会超过256M。因此,您应该选择 256M 或查询 #1 的结果,以较小者为准。

如果您没有任何 InnoDB 数据,请将其添加到 my.cnf (my.ini)

[mysqld]
skip-innodb
Run Code Online (Sandbox Code Playgroud)

并重新启动mysql。这样,mysqld 将启动得更快,因为它不必检查 InnoDB 崩溃恢复。

您提到您的应用程序编写密集。INSERTs、UPDATEs、DELETE混用会导致表和索引匆忙分片。如果是这种情况,需要将MYiSAM表的行格式转换为Fixed。为什么?

MySQL Database Design and Tuning一书推荐使用ROW_FORMAT=FIXED第 72,73 页。这将在内部将所有 VARCHAR 字段转换为 CHAR。它会使 MyISAM 表变大,但对它执行 SELECT 会快得多。我可以亲自证明这一点。我曾经有一个 1.9GB 的表。我用ALTER TABLE tblname ROW_FORMAT=FIXED. 该表最终为 3.7GB。SELECTs 的速度比它快了 20-25%,而没有改进或改变任何其他东西。

所有 InnoDB

请运行此查询

查询 #3

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)

此查询将告诉您数据和索引需要多大的 InnoDB 缓冲池(以 MB 为单位)。当然,安装的 RAM 数量优先,因此请使用常识。您应该运行 Query #2 并更严格地应用相同的 DataToIndexRatio 规则,因为 InnoDB 中的二级索引往往比它们的 MyISAM 对应项更加臃肿。

如果您正在运行 MySQL 5.5,请调整 InnoDB 以实现多 CPU 使用:

因为您只有 768MB 的 RAM,我再次建议为 innodb_buffer_pool_size 或查询 #3 的结果使用 256MB,以较小者为准。

您应该调整 InnoDB 日志缓冲区的大小。例如,如果您选择的 innodb_buffer_pool_size 是 256M,则需要将日志文件大小调整为该数字的 25%,即 64M,如下所示:

步骤 01) 关闭 mysql

  • service mysql stop 适用于 Linux
  • net stop mysql 适用于 Windows

步骤 02) 删除 ib_logfile0 和 ib_logfile1

STEP 03) 将此添加到 my.cnf (my.ini)

[mysqld]
innodb_log_file_size = 64M
Run Code Online (Sandbox Code Playgroud)

STEP 04)启动mysql(日志文件重新创建到新大小)

  • service mysql start 适用于 Linux
  • net start mysql 适用于 Windows

InnoDB 和 MyISAM 混合

我将适用上述规则或分割为128MB的key_buffer_size和128MB的innodb_buffer_pool大小

概括

我选择 256M 是因为无论您拥有何种存储引擎组合,您都有一个写入密集型应用程序。您需要对 InnoDB 和 MyISAM 索引进行良好的缓存。

另一方面,我只留出 256MB 的一个或两个存储引擎,因为操作系统将需要尽可能多的 RAM 用于以下方面:

玩得开心配置所有这些方面!!!