老张
资深系统架构师
MySQL作为最流行的开源关系型数据库,在实际应用中经常会遇到性能瓶颈。本文总结了我在多年工作中积累的MySQL性能优化经验,希望能帮助大家提升数据库性能。
索引是提升查询性能的关键,但不当的索引设计反而会降低性能。
-- 创建复合索引
CREATE INDEX idx_user_info ON users(city, age, name);
-- 可以使用索引的查询
SELECT * FROM users WHERE city = '北京';
SELECT * FROM users WHERE city = '北京' AND age = 25;
-- 无法使用索引的查询
SELECT * FROM users WHERE age = 25; EXPLAIN SELECT * FROM orders WHERE user_id = 123; 关注以下关键指标:
type:访问类型,最好是const、eq_ref、refkey:实际使用的索引rows:扫描的行数,越少越好Extra:额外信息,避免Using filesort和Using temporary-- 不推荐
SELECT * FROM users WHERE id = 1;
-- 推荐
SELECT id, name, email FROM users WHERE id = 1; -- 传统分页(深分页性能差)
SELECT * FROM orders ORDER BY id LIMIT 100000, 20;
-- 优化后(使用子查询)
SELECT * FROM orders WHERE id >= (
SELECT id FROM orders ORDER BY id LIMIT 100000, 1
) LIMIT 20; # my.cnf 配置示例
[mysqld]
# InnoDB缓冲池大小(建议设置为物理内存的70-80%)
innodb_buffer_pool_size = 8G
# 日志文件大小
innodb_log_file_size = 512M
# 连接数
max_connections = 500
# 查询缓存(MySQL 8.0已移除)
query_cache_size = 0
# 临时表大小
tmp_table_size = 64M
max_heap_table_size = 64M -- 按日期分区
CREATE TABLE orders (
id INT,
order_date DATE,
amount DECIMAL(10,2)
) PARTITION BY RANGE (YEAR(order_date)) {
PARTITION p2022 VALUES LESS THAN (2023),
PARTITION p2023 VALUES LESS THAN (2024),
PARTITION p2024 VALUES LESS THAN (2025)
}; # 开启慢查询日志
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
# 分析慢查询
mysqldumpslow -s t -t 10 /var/log/mysql/slow.log 问题:订单列表查询慢,平均响应时间3秒
原因分析:
优化方案:
效果:响应时间降低到200ms,性能提升15倍
MySQL性能优化是一个系统工程,需要从多个维度入手:
性能优化没有银弹,需要根据实际情况分析和调整。建议在优化前做好基准测试,优化后验证效果。