300 GB Innodb的MySQL 5.7性能问题

300 GB Innodb的MySQL 5.7性能问题,mysql,Mysql,我们的数据库运行在Mysql 5.7上,数据库大小约为300GB。数据库运行在专用Linux服务器(RHEL 6)上,具有144 GB RAM、16个CPU和15 GB交换大小 服务器一整天都很忙,至少有50个连接。大多数查询都有索引,每周优化一次。但我们仍然面临着性能问题。因此,请求查看my.cnf配置,并提出更改建议 my.cnf如下所示: [mysqld] basedir=/usr datadir=/sql/mysql/data57 socket=/sql/mysql/data/mysql

我们的数据库运行在Mysql 5.7上,数据库大小约为300GB。数据库运行在专用Linux服务器(RHEL 6)上,具有144 GB RAM、16个CPU和15 GB交换大小

服务器一整天都很忙,至少有50个连接。大多数查询都有索引,每周优化一次。但我们仍然面临着性能问题。因此,请求查看my.cnf配置,并提出更改建议

my.cnf如下所示:

[mysqld]
basedir=/usr
datadir=/sql/mysql/data57
socket=/sql/mysql/data/mysql.sock
skip-external-locking
key_buffer_size = 4000M
max_allowed_packet = 5120M
table_open_cache = 4000
sort_buffer_size = 128M
read_buffer_size =8M
join_buffer_size=128M
read_rnd_buffer_size = 16M
myisam_sort_buffer_size = 128M
thread_cache_size = 100
query_cache_size=0
query_cache_limit=4M
query_cache_type="ON"
query_cache_min_res_unit=20K
query_prealloc_size=40K
query_alloc_block_size=40K
max_connections=300
sql_mode = ""
interactive_timeout = 28800
wait_timeout = 7200
connect_timeout = 60
default_password_lifetime=0
old_passwords=2
lower_case_table_names=1
tmpdir=/tmpfs
tmp_table_size=20G
max_heap_table_size=170M
innodb_buffer_pool_size=100G
innodb_buffer_pool_instances=16
innodb_buffer_pool_chunk_size=6562M
innodb_read_io_threads=64
innodb_write_io_threads=64
innodb_log_file_size=2G
innodb_lock_wait_timeout=180
net_buffer_length=8K
transaction-isolation=READ-COMMITTED
innodb_lock_wait_timeout=180
federated


log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

[client]
port=3306
socket=/sql/mysql/data/mysql.sock

[mysql.server]
user=mysql
basedir=/usr
log-bin=mysql-bin
binlog_format=mixed
server-id=1

[mysqldump]
quick
max_allowed_packet=1G

[mysql]
no-auto-rehash

[myisamchk]
key_buffer_size=1024M
sort_buffer_size=256K
read_buffer=8M
write_buffer=8M

[mysqlhotcopy]
interactive-timeout

我建议采用不同的性能优化方法,与MySQL服务器重新配置无关

首先,尝试分析您的表结构,看看它们是否正确设置了最佳列类型,对于像您这样的大型数据库-每一位都很重要:

 SELECT * FROM table PROCEDURE ANALYSE();
PROCEDURE analysis
将根据表中的数据告诉您表中列的建议类型。这将有助于提高读/写表的效率

第二步,尝试启用所谓的“慢速查询日志”,然后研究其中显示的查询。这将帮助您避免由于编写糟糕的查询而导致的一些可能的灾难性故障,并最终优化它们:

SET GLOBAL slow_query_log = 'ON'; 

刷新日志


在我看来,找到一种解决具体性能问题的方法非常重要,这样您就知道您正在解决正确的问题。考虑使用一个分析器来找到瓶颈,然后处理这个特定的问题。将所有内容重置回默认值(只需注释掉并重新启动服务器),innodb_缓冲池除外。您希望它拥有总内存的80%。这可能已经是您的解决方案。同样,当您不知道设置的作用时,不要只是增加值!非常感谢。我们在测试环境中做这件事。。我有个问题。。根据您的评论,如果我们将所有值重置为Innodb_buffer_pool之外的默认值,那么MySQL将如何决定这些值?正如我所说,它将使用默认值。没有什么可决定的。硬编码的值在大多数情况下都是好的。谢谢你的建议。我将使用慢速查询日志分析表和查询