作为IT工程师,我将为您提供一套完整的LNMP环境下MySQL数据库查询优化方案,涵盖从基础配置到高级优化的多个层面。
[mysqld]
# 缓冲池大小(通常设为可用内存的50-70%)
innodb_buffer_pool_size = 4G
# 日志文件大小
innodb_log_file_size = 256M
innodb_log_buffer_size = 16M
# 连接设置
max_connections = 500
thread_cache_size = 50
wait_timeout = 300
# 查询缓存(MySQL 8.0已移除)
# query_cache_size = 64M
# query_cache_limit = 2M
# 其他重要参数
innodb_flush_log_at_trx_commit = 1 # 数据安全性高
# innodb_flush_log_at_trx_commit = 2 # 性能更好但安全性降低
sync_binlog = 1
innodb_file_per_table = ON
innodb_flush_method = O_DIRECT
; php-fpm.conf优化
pm = dynamic
pm.max_children = 100
pm.start_servers = 20
pm.min_spare_servers = 10
pm.max_spare_servers = 30
; php.ini优化
opcache.enable=1
opcache.memory_consumption=128
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
-- 示例:添加合适索引
ALTER TABLE `users` ADD INDEX `idx_email_status` (`email`, `status`);
-- 优化后的分页查询示例
SELECT id, name FROM products
WHERE status = 1 AND category_id = 5
ORDER BY create_time DESC
LIMIT 10000, 20; -- 大偏移量分页问题需要特别处理
-- 大偏移量分页优化示例
SELECT * FROM products
INNER JOIN (
SELECT id FROM products
WHERE status = 1
ORDER BY create_time DESC
LIMIT 10000, 20
) AS tmp USING(id);
-- 启用慢查询日志
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;
SET GLOBAL slow_query_log_file = '/var/log/mysql/mysql-slow.log';
通过以上多层次的优化措施,可以显著提升LNMP环境下MySQL数据库的查询性能,建议根据实际业务场景和监控数据逐步调整优化参数。