AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 18147
Accepted
Alireza
Alireza
Asked: 2012-05-19 04:51:18 +0800 CST2012-05-19 04:51:18 +0800 CST 2012-05-19 04:51:18 +0800 CST

对于768M内存的服务器,在my.cnf中分配617M是好是坏?

  • 772

我有一个写密集型的网络应用程序,我买了一个 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
mysql mysql-5
  • 1 1 个回答
  • 561 Views

1 个回答

  • Voted
  1. Best Answer
    RolandoMySQLDBA
    2012-05-19T05:39:42+08:002012-05-19T05:39:42+08:00

    这取决于 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;
    

    此查询将告诉您数据需要多大的 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;
    

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

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

    [mysqld]
    skip-innodb
    

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

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

    MySQL Database Design and Tuning一书在第 72,73 页推荐使用ROW_FORMAT=FIXED。这将在内部将所有 VARCHAR 字段转换为 CHAR。它会使 MyISAM 表更大,但对其执行 SELECT 会更快。我可以亲自证明这一点。我曾经有一张 1.9GB 的桌子。我用ALTER TABLE tblname ROW_FORMAT=FIXED. 该表最终为 3.7GB。在没有改进或改变其他任何东西的情况下,针对它的 SELECT 速度提高了 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;
    

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

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

    • 可以让MySQL使用多个内核吗?
    • 关于单线程与多线程数据库的性能
    • 多核和 MySQL 性能

    因为您只有 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

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

    [mysqld]
    innodb_log_file_size = 64M
    

    STEP 04) Startup mysql (log files are recreated to the new size)

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

    InnoDB 和 MyISAM 混合

    我将应用上述规则并将 key_buffer_size 的128MB和innodb_buffer_pool size的 128MB 分开。

    概括

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

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

    • 操作系统
    • 查询缓存
    • 数据库连接(每个连接的缓冲区、最大连接数)
    • 文件句柄(open_files_limit,innodb_open_files(如果使用innodb_file_per_table))

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

    • 5

相关问题

  • 是否有任何 MySQL 基准测试工具?[关闭]

  • 我在哪里可以找到mysql慢日志?

  • 如何优化大型数据库的 mysqldump?

  • 什么时候是使用 MariaDB 而不是 MySQL 的合适时机,为什么?

  • 组如何跟踪数据库架构更改?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何查看 Oracle 中的数据库列表?

    • 8 个回答
  • Marko Smith

    mysql innodb_buffer_pool_size 应该有多大?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    从 .frm 和 .ibd 文件恢复表?

    • 10 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve