想象你开了一家银行:
-- 糟糕的查询
SELECT * FROM orders WHERE create_time > '2024-01-01';
-- 优化后的查询
SELECT order_id, user_id, total_amount
FROM orders
WHERE create_time > '2024-01-01';
为什么要改?
案例2:索引使用不当
-- 有一个用户表
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(50),
age INT,
city VARCHAR(50),
create_time DATETIME
);
-- 错误的索引使用
SELECT * FROM users WHERE age > 20; -- age变化太多,不适合建索引
-- 正确的索引使用
CREATE INDEX idx_city_age ON users(city, age); -- 城市+年龄组合索引
SELECT * FROM users WHERE city = '北京' AND age > 20;
通俗解释:
-- 假设要查询订单及其用户信息
-- 糟糕的写法
SELECT o.*, u.*
FROM orders o
LEFT JOIN users u ON o.user_id = u.id;
-- 优化后的写法
SELECT o.order_id, o.total_amount,
u.name, u.phone
FROM orders o
LEFT JOIN users u ON o.user_id = u.id
WHERE o.create_time > '2024-01-01';
-- 不好的设计
CREATE TABLE user_info (
id INT,
info TEXT -- 存储所有信息
);
-- 好的设计
CREATE TABLE user_info (
id INT,
name VARCHAR(50),
phone VARCHAR(20),
address VARCHAR(200)
);
就像整理衣柜:
3.2 批量插入优化
-- 低效的方式
INSERT INTO orders VALUES (1, 100);
INSERT INTO orders VALUES (2, 200);
INSERT INTO orders VALUES (3, 300);
-- 高效的方式
INSERT INTO orders VALUES
(1, 100),
(2, 200),
(3, 300);
就像快递:
-- 开启慢查询日志
SET GLOBAL slow_query_log = 1;
SET GLOBAL long_query_time = 2; -- 设置2秒以上的查询记录到慢查询日志
就像查看监控录像,找出哪些操作特别耗时
-- 分析表
ANALYZE TABLE orders;
-- 优化表
OPTIMIZE TABLE orders;
就像定期打扫房间,保持整洁高效
-- 查看当前连接数
SHOW STATUS LIKE 'Threads_connected';
-- 查看缓存命中率
SHOW STATUS LIKE 'Innodb_buffer_pool_read_requests';
SHOW STATUS LIKE 'Innodb_buffer_pool_reads';
记住这些关键点:
最后的建议:性能优化不是一蹴而就的,需要在实践中不断积累经验。就像练武功,需要日积月累!加油!