【发布时间】:2021-09-03 17:05:51
【问题描述】:
我目前在我的 16gb 服务器上为我的大约 15 个网站(主要是 WordPress 和 PHP 框架)使用以下配置:
key_buffer_size = 256M
max_allowed_packet = 256M
thread_stack = 256K
thread_cache_size = 256K
table_open_cache = 10000
table_definition_cache = 8192
innodb_file_per_table = 1
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT
innodb_buffer_pool_size = 10G
innodb_buffer_pool_instances = 10
innodb_log_file_size = 1G
innodb_read_io_threads = 8
innodb_write_io_threads = 8
innodb_io_capacity = 2000
tmp_table_size = 256M
max_heap_table_size = 256M
sort_buffer_size = 4M
read_buffer_size = 256K
join_buffer_size = 256K
read_rnd_buffer_size = 256K
query_cache_size = 0
query_cache_type = 0
query_cache_limit = 128M
myisam-recover-options = BACKUP
max_connections = 500
几个月来一切都很顺利,但我发现优化和内存使用之间的完美平衡(有些网站真的是 SQL 密集型的)。但是几天前我看到 MySQL 被杀死了,因为 ram 使用量超过了可用 RAM(如果我记得的话,在 16 上超过 10 GB)。
所以我的问题是,当这种情况发生时,您应该首先在 MySQL 配置中减少什么?我在所有 *_buffer_size 和 inno_pool_size 之间犹豫不决,因此为了在更短的时间内释放更多 RAM,我将这些变量减少为:
innodb_buffer_pool_size = 8G
innodb_buffer_pool_instances = 8
目前一切都很好,我现在是 9gb/16gb,但我不知道这是否可行。
谢谢。
编辑:添加来自网站的示例查询
"SELECT c.cover, c.type, cl.slug, cl.label, GROUP_CONCAT(p.id) AS links
FROM card c
INNER JOIN card_language cl ON cl.card_id = c.id AND cl.language_id = " . $language->id . "
INNER JOIN card_has_card_category chcc ON chcc.card_id = c.id
INNER JOIN card_category_language ccl ON ccl.card_category_id = chcc.card_category_id AND ccl.language_id = " . $language->id . "
LEFT JOIN card_has_links cp ON cp.card_id = c.id
LEFT JOIN link p ON p.id = cp.link_id
WHERE c.type = '" . $type . "'
AND ccl.slug = '" . $slug . "'
GROUP BY cl.slug
ORDER BY c.id DESC
LIMIT " . $limit . "
OFFSET " . $offset . "
;"
【问题讨论】:
标签: mysql optimization ram