如何优化 MySQL (CentOS)

How to Optimize MySQL (CentOS)

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

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

我托管的其中一个应用程序有问题,速度慢,有时会放弃错误 "max user connections"。

下面是在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

如果你能帮助我谢谢:)

您似乎混合使用了 MyISAM 和 InnoDB 表。最好选择一个或另一个 - 几乎可以肯定的是,InnoDB 在优化方面会更好。

您应该将解决方案中的所有表转换为 InnoDB。如果您的解决方案可以创建新表,请将默认存储引擎类型也更改为 InnoDB。

default-storage-engine=InnoDB

然后,由于您有足够的 RAM,请进行调整以确保所有数据都适合 RAM,这样 MySQL 就不必一直进行昂贵的磁盘读取。将 innodb_buffer_pool_size 设置为至少 1G,如果您的数据库将快速增长,则可能更多。你可以安全地增加到 2G,只要你没有任何其他真正占用内存的东西 运行 VPS.

innodb_buffer_pool_size=2G

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

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

max_user_connections=100

统计数据还显示您有大量查询在没有索引的情况下执行

[!!] Joins performed without indexes: 21719

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

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

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

我强烈推荐使用 MySQL GUI(例如 sqlyog)来尝试索引。 MySQL 客户端工具也可以。

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

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

Run OPTIMIZE TABLE to defragment tables for better performance.

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

2G 的缓冲池对于一个 4GB 的小系统来说太大了,特别是当你使用 MyISAM tables 时。

当你有混合物时:

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

查询缓存正在执行大量修剪。 写入一个table 都会强制修剪table 的所有 个条目。一般来说,生产服务器应该关闭 QC。将大小提高到 64M 以上会使情况变得更糟。

max_user_connections=40

是否一个"user"一次连接超过40次?或者您有 MaxClients > 40 的 Apache 吗?

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