傻子学编程之——数据库如何性能优化
傻子学编程之——数据库如何性能优化
数据库就像一个大仓库,性能优化就是让仓库管理员(数据库)更高效地存取货物(数据)。本文用最简单直白的方式,教你如何避开常见坑点,让数据库跑得更快更稳。
一、数据库性能的「常见故障」
1. 慢得像蜗牛的查询
- 现象:一个查询等了几十秒还没结果
- 原因:没走索引、全表扫描、复杂计算多
-- 错误示范:全表扫描且字段不明确
SELECT * FROM user WHERE age+1 > 20;
2. 索引用了个寂寞
- 现象:明明加了索引,查询还是慢
- 原因:索引设计不合理、违反最左前缀原则
-- 错误索引:联合索引 (name, age) 但查询只用 age
SELECT * FROM user WHERE age = 25;
3. 服务器累到冒烟
- 现象:CPU 100%、内存爆满
- 原因:连接池未配置、频繁创建连接、大事务堆积
// 错误代码:每次查询都新建连接
for (int i=0; i<1000; i++) {Connection conn = DriverManager.getConnection(url);//...
}
二、优化三板斧
1. 索引优化:给数据库装GPS
- 原则:高频查询字段优先、区分度高的字段优先
-- 正确做法:创建联合索引并覆盖查询
ALTER TABLE orders ADD INDEX idx_user_product (user_id, product_id);
SELECT order_id FROM orders WHERE user_id=100 AND product_id=5;
-- 命中索引
2. SQL 语句瘦身计划
- 技巧:
- 用
UNION ALL
代替UNION
(不去重效率更高) - 避免
SELECT *
,只取需要的字段
- 用
-- 优化前(耗时 2.3s)
SELECT * FROM logs WHERE create_time > '2024-01-01';-- 优化后(耗时 0.5s)
SELECT log_id, content FROM logs
WHERE create_time > '2024-01-01'
ORDER BY log_id DESC LIMIT 100;
3. 硬件与配置调优
- 关键参数:
# my.cnf 配置示例
innodb_buffer_pool_size = 4G # 内存的70%-80%
max_connections = 500 # 根据业务调整
slow_query_log = 1 # 开启慢查询日志
三、进阶技巧(附代码)
1. 慢查询日志分析
-- 步骤1:开启慢查询监控
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 2; -- 超过2秒的查询记入日志-- 步骤2:用 EXPLAIN 分析问题SQL
EXPLAIN SELECT * FROM products WHERE price BETWEEN 100 AND 200;
2. 连接池配置(Java示例)
// HikariCP 配置(高性能连接池)
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/mydb");
config.setUsername("root");
config.setPassword("123456");
config.setMaximumPoolSize(20); // 最大连接数
HikariDataSource ds = new HikariDataSource(config);
四、防坑指南
- 锁的陷阱:长事务会导致行锁升级为表锁,更新时用
WHERE
精确条件 - 别让硬盘哭:频繁更新的大表建议用
TRUNCATE
代替DELETE
- 数据类型坑:IP地址用
INT
存比VARCHAR(15)
快3倍
-- 正确存储IP
INSERT INTO access_log (ip) VALUES (INET_ATON('192.168.1.1'));
五、终极武器:监控体系
- 必备监控项:
- QPS(每秒查询量)
- 慢查询占比
- 连接池使用率
优化不是玄学,记住这个口诀:
索引要走对,SQL别浪费;
连接要复用,监控不能跪;
硬件要给力,慢查要定位。