如何优化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 

我在我托管的一个应用程序中遇到了问题,速度慢,有时会放弃错误"最大用户连接数"。

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

低于我的.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上没有任何其他真正的ram密集型运行。

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了解更多信息。

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

我强烈推荐像sqlyog这样的MySQL GUI来处理索引。MySQL客户端工具也可以。

有关更多详细信息,请参阅以下帖子https://www.percona.com/blog/2007/11/01/innodb-performance-optimization-basics/(有点老了,但仍然讲道理)。

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

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

那是假建议。它几乎从不有用,尤其是对于InnoDB。

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

当你有混合物时:

key_buffer_size = 200M
innodb_buffer_pool_size = 500M

切换到InnoDB后:

key_buffer_size = 30M
innodb_buffer_pool_size = 1000M

交换比降低值糟糕得多。

请参阅我关于从MyISAM转换为InnoDB的提示。

查询缓存正在进行大量修剪对表的每次写入都会强制修剪该表的所有条目。通常,生产服务器的QC应关闭。将规模提高到64M以上会使情况变得更糟。

max_user_connections=40

一个"用户"是否同时连接40多次?或者您有MaxClients>40的Apache?

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