Ali*_*eza 1 mysql mysql-5 my.cnf
我有一个写入密集型的网络应用程序,我买了一个 768M RAM 的 VDS
我将 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)
这取决于 MySQL 数据的数量以及您使用的存储引擎
当涉及到 MyISAM 和 InnoDB 时,它们的缓存不同。我在 2011 年 4 月 14 日写了一篇关于此的帖子。
由于您的机器只有 768M 的 RAM,因此您必须根据您使用最多的存储引擎来做一个很好的平衡。
请运行此查询
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 数量优先,因此请使用常识。您应该运行此查询:
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%,而没有改进或改变任何其他东西。
请运行此查询
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 适用于 Linuxnet 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 适用于 Linuxnet start mysql 适用于 Windows我将适用上述规则或分割为128MB的key_buffer_size和128MB的innodb_buffer_pool大小。
我选择 256M 是因为无论您拥有何种存储引擎组合,您都有一个写入密集型应用程序。您需要对 InnoDB 和 MyISAM 索引进行良好的缓存。
另一方面,我只留出 256MB 的一个或两个存储引擎,因为操作系统将需要尽可能多的 RAM 用于以下方面:
玩得开心配置所有这些方面!!!
| 归档时间: |
|
| 查看次数: |
560 次 |
| 最近记录: |