上一篇
想象一下:你刚上线的电商平台,在促销活动时突然卡成PPT,用户疯狂刷新页面,订单提交要等十几秒,后台日志里堆满"Timeout"警告——数据库成了瓶颈,作为开发者,这时候你需要的不是祈祷服务器自己变快,而是一套系统的MySQL优化方案。
别担心,这份指南将带你从SQL语句、索引设计到服务器配置,全方位提升MySQL性能。
-- 反面教材(没有索引的字段条件) SELECT * FROM orders WHERE status = 'pending'; -- 优化方案:为status字段添加索引 ALTER TABLE orders ADD INDEX idx_status (status);
-- 不推荐(读取无用字段) SELECT * FROM products WHERE category = 'electronics'; -- 推荐(只取必要字段) SELECT product_id, name, price FROM products WHERE category = 'electronics';
-- 低效写法(偏移量大时) SELECT * FROM logs ORDER BY id LIMIT 100000, 20; -- 高效写法(基于ID游标) SELECT * FROM logs WHERE id > 100000 ORDER BY id LIMIT 20;
-- 组合索引 (user_id, create_time) SELECT * FROM orders WHERE user_id = 100; -- 能用索引 SELECT * FROM orders WHERE create_time > '2025-01-01'; -- 不能用
WHERE YEAR(create_time) = 2025
WHERE user_id = '100'
(user_id是整型) WHERE name LIKE '%张'
-- 查看索引使用情况 SHOW INDEX FROM orders; -- 重建碎片化索引 ALTER TABLE orders ENGINE=InnoDB;
[mysqld] innodb_buffer_pool_size = 4G # 总内存的50-70% key_buffer_size = 256M # MyISAM表专用(如无使用可调小) query_cache_size = 0 # MySQL 8.0已移除查询缓存
-- 避免长事务 SET SESSION autocommit=1; -- 开启自动提交 -- 合理设置隔离级别(通常选REPEATABLE-READ) SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
max_connections = 200 # 根据应用需求调整 wait_timeout = 300 # 非交互连接超时时间(秒) thread_cache_size = 32 # 线程缓存数量
-- 按时间范围分区 CREATE TABLE sensor_data ( id BIGINT, record_time DATETIME, value DECIMAL(10,2) ) PARTITION BY RANGE (TO_DAYS(record_time)) ( PARTITION p2025 VALUES LESS THAN (TO_DAYS('2026-01-01')), PARTITION pmax VALUES LESS THAN MAXVALUE );
Threads_connected/max_connections
-- 查看当前运行线程 SHOW PROCESSLIST; -- 分析SQL执行计划 EXPLAIN SELECT * FROM users WHERE age > 30; -- 开启慢查询日志 SET GLOBAL slow_query_log = ON; SET GLOBAL long_query_time = 1;
数据库优化没有"银弹",需要结合业务特点持续迭代,记住三个关键点:
按照这个思路优化后,那个卡顿的电商平台现在应该能轻松应对流量高峰了,如果你的MySQL还有其他"疑难杂症",不妨从这些方向入手排查。
本文由 尧代容 于2025-08-01发表在【云服务器提供商】,文中图片由(尧代容)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/508760.html
发表评论