【问题标题】:How to Optimize MySQL (CentOS)如何优化 MySQL (CentOS)
【发布时间】:2015-06-03 17:49:33
【问题描述】:

我在优化要使用的 VPS MySQL 时遇到问题。我在 RamNode 中有一个具有以下规格的计划:

- Intel® Xeon® CPU E3-1240 V2 @ 3.40GHz (4 Cores)
- 4GB de Ram
- 135 GB SSD Raid 10 

我托管的一个应用程序出现问题,速度慢,有时会放弃错误“最大用户连接数”。

下面是在 MySQLTunner 中进行的测试:

存储引擎统计数据

[--] Status: +ARCHIVE +BLACKHOLE +CSV -FEDERATED +InnoDB +MRG_MYISAM
[--] Data in MyISAM tables: 136M (Tables: 300)
[--] Data in InnoDB tables: 44M (Tables: 202)
[--] Data in PERFORMANCE_SCHEMA tables: 0B (Tables: 17)
[!!] Total fragmented tables: 220

性能指标

[--] Up for: 1d 20h 25m 13s (3M q [23.681 qps], 251K conn, TX: 9B, RX: 605M)
[--] Reads / Writes: 57% / 43%
[--] Total buffers: 528.0M global + 3.6M per thread (400 max threads)
[!!] Query cache prunes per day: 7322
[!!] Sorts requiring temporary tables: 69% (144K temp sorts / 208K sorts)
[!!] Joins performed without indexes: 21719

-------- 推荐 -------------------------------------- ---------------

一般建议: 运行 OPTIMIZE TABLE 对表进行碎片整理以获得更好的性能。启用慢查询日志以解决错误查询。调整您的连接查询以始终使用索引

要调整的变量:

  query_cache_size (> 64M)
  sort_buffer_size (> 2M)
  read_rnd_buffer_size (> 236K)
  join_buffer_size (> 128.0K, or always use indexes with joins) 

My.CNF 下方

[mysqld]    
max_connections = 400    
max_user_connections=40    
key_buffer_size = 256M    
myisam_sort_buffer_size = 16M    
read_buffer_size = 1M
table_open_cache = 2048
thread_cache_size = 128
wait_timeout = 20
connect_timeout = 10
tmp_table_size = 128M
max_heap_table_size = 64M
max_allowed_packet=268435456
net_buffer_length = 5500
max_connect_errors = 10
concurrent_insert = 2
read_rnd_buffer_size = 242144
bulk_insert_buffer_size = 2M
query_cache_limit = 2M
query_cache_size = 64M
query_cache_type = 1
query_prealloc_size = 87382
query_alloc_block_size = 21845
transaction_alloc_block_size = 2730
transaction_prealloc_size = 1364
max_write_lock_count = 2
log-error
external-locking=FALSE
open_files_limit=15000
default-storage-engine=MyISAM
innodb_file_per_table=1
[mysqld_safe]

[mysqldump]
quick
max_allowed_packet = 8M
[isamchk]
key_buffer = 128M
sort_buffer = 128M
read_buffer = 64M
write_buffer = 64M

[myisamchk]
key_buffer = 128M
sort_buffer = 128M
read_buffer = 64M
write_buffer = 64M 

#### Per connection configuration ####
sort_buffer_size = 2M
join_buffer_size = 2M
thread_stack = 192K
log-slow-queries

如果你能帮助我,谢谢:)

【问题讨论】:

  • 如果你把整个mysqltunermy.cnf 都放在这里就不好看了。只放重要的相关内容

标签: php mysql multithreading performance caching


【解决方案1】:

您似乎混合使用了 MyISAM 和 InnoDB 表。最好选择其中一个 - 几乎可以肯定 InnoDB 会更好地进行优化。

您应该将解决方案中的所有表都转换为 InnoDB。如果您的解决方案可以创建新表,请将 default-storage-engine 类型也更改为 InnoDB。

default-storage-engine=InnoDB

然后,既然您有足够的 RAM,请调整以确保您的所有数据都适合 RAM,这样 MySQL 就不必一直进行昂贵的磁盘读取。将 innodb_buffer_pool_size 设置为至少 1G,如果您的数据库要快速增长,可能会更多。只要您没有在此 VPS 上运行任何真正需要大量内存的东西,您可能可以安全地提升到 2G。

innodb_buffer_pool_size=2G

目前您正在使用默认的 InnoDB 配置选项运行,这看起来不错(144MB 池大小,数据大小仅为 44Mb),但您也可以配置增长并利用您拥有的 RAM。此外,如果您将 140Mb 的 MyISAM 表转换为 InnoDB(推荐),那么您确实需要这个数字更高。此设置可能是最重要的,并且可能对性能产生最大的影响。

此外,当您达到最大连接数时,您也需要增加该值。您的 VPS 应该能够处理超过默认值 40 - 尝试 50-100 之间的任意值,具体取决于您期望的并发用户/连接数。

max_user_connections=100

统计数据还显示,您执行了大量没有索引的查询

[!!] 不使用索引执行的连接:21719

这需要注意。如果不清楚哪些字段需要索引(通常是连接语句中使用的任何字段,以及用于搜索和过滤的某些字段,特别是如果它们是数字并且只有有限的值选择),您可以尝试在你最喜欢的 mysql 客户端,带有 EXPLAIN 语句。这将为您提供有关查询的哪些部分执行不佳的详细信息。

有关详细信息,请参阅 Mysql 手册https://dev.mysql.com/doc/refman/5.6/en/explain.html

总是值得尝试添加索引,看看它们是否能提高查询性能。如果没有,请再次删除它们,因为索引会使插入/更新操作在服务器资源方面更加昂贵(因为需要更新索引以及基础数据)。

我强烈推荐使用 MySQL GUI,例如 sqlyog 来玩转索引。 MySQL客户端工具也可以。

更多详情见https://www.percona.com/blog/2007/11/01/innodb-performance-optimization-basics/等帖子(有点老,但还是有道理的)。

如果你有一个令人信服的理由想要使用 MyISAM 而不是 InnoDB(我真的想不出一个),那么你需要不同的建议,因为对 innodb 池大小的建议是没有用的给你。

【讨论】:

  • 我的数据库只有200MB!
  • 当然,但它会继续增长。你有足够的 RAM,所以为什么不从 1G 的 InnoDB 缓冲区开始。除非需要,否则不会使用它。你只是在验证你的配置。
  • 有什么原因不能将您的 MyISAM 表转换为 InnoDB?
  • 还意识到您可能有索引问题,所以我在回答中添加了一些建议!
  • 好的,我会把所有的表都转成InnoDB
【解决方案2】:

运行 OPTIMIZE TABLE 对表进行碎片整理以获得更好的性能。

那是虚假的建议。它几乎从来没有用过,尤其是对于 InnoDB。

对于一个 4GB 的小型系统来说,2G 的缓冲池非常大,尤其是当您使用 MyISAM 表时。

当你有混合物时:

key_buffer_size = 200M
innodb_buffer_pool_size = 500M

切换到 InnoDB 后:

key_buffer_size = 30M
innodb_buffer_pool_size = 1000M

交换比降低价值要糟糕得多。

my tips on converting from MyISAM to InnoDB

查询缓存做了很多修剪。 每次 写入表都会强制删除该表的 所有 条目。一般来说,应该关闭生产服务器的 QC。将大小提高到 64M 以上会使情况变得更糟。

max_user_connections=40

一个“用户”是否一次连接超过 40 次?或者你有 MaxClients > 40 的 Apache?

向我们展示您的几个慢查询,以及SHOW CREATE TABLE;我们也许可以加快它们的速度。

【讨论】:

  • 我在 4GB 系统上使用 2GB 大小的 innodb 缓冲池取得了不错的效果,否则我不会推荐它。但是,在这种情况下,我们不知道 VPS 上还运行了什么,所以是的,将其保持在 1GB 是一个更安全的选择。我收到或阅读的所有建议是,您可以安全地将这个值设置为机器可用 RAM 的 75% 左右。另请注意,我的建议是将 MyISAM 表转换为 InnoDB。
  • 我担心 4GB 中还有其他应用程序。无论如何,即使转换为 InnoDB,数据集也可能会低于 500M。请注意 75% 的 可用 RAM。
猜你喜欢
  • 2014-03-01
  • 1970-01-01
  • 2014-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多