MySQL性能优化实战笔记 - 通俗易懂版

1. 存储引擎选择 - 到底选哪个?

InnoDB vs MyISAM 通俗对比

想象你开了一家银行:

  • InnoDB 就像是有保险柜的银行 
  • 支持事务:比如转账,要么都成功,要么都失败
  • 行级锁:小明在存钱时,小红还能同时取钱
  • 缺点:需要更多内存和CPU
  • MyISAM 就像是简易储物柜
  • 不支持事务:操作简单直接
  • 表级锁:一个人在用时,其他人要等待
  • 优点:读取速度快,占用资源少

2. 实战案例:常见性能问题及解决方案

案例1:查询特别慢 

-- 糟糕的查询
SELECT * FROM orders WHERE create_time > '2024-01-01';

-- 优化后的查询
SELECT order_id, user_id, total_amount 
FROM orders 
WHERE create_time > '2024-01-01';

为什么要改?

  • SELECT * 就像去超市买东西,把所有商品都搬回家,太累了!
  • 只选需要的字段,就像只买需要的东西,轻松又快速

案例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;

 

通俗解释:

  • 索引就像图书的目录,帮你快速找到内容
  • 但是如果目录太多,反而会占用空间,让书变得很厚

案例3:连接查询优化

-- 假设要查询订单及其用户信息
-- 糟糕的写法
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';

3. 实用性能优化小技巧

3.1 合理设计表结构

-- 不好的设计
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);

就像快递:

  • 一个一个送 vs 一次性送一批
  • 批量操作能显著提高效率

4. 日常维护必知必会 ️

4.1 查看慢查询

-- 开启慢查询日志
SET GLOBAL slow_query_log = 1;
SET GLOBAL long_query_time = 2;  -- 设置2秒以上的查询记录到慢查询日志

就像查看监控录像,找出哪些操作特别耗时

4.2 定期清理和优化

-- 分析表
ANALYZE TABLE orders;

-- 优化表
OPTIMIZE TABLE orders;

就像定期打扫房间,保持整洁高效

5. 性能监控小贴士

常用监控命令

-- 查看当前连接数
SHOW STATUS LIKE 'Threads_connected';

-- 查看缓存命中率
SHOW STATUS LIKE 'Innodb_buffer_pool_read_requests';
SHOW STATUS LIKE 'Innodb_buffer_pool_reads';

实用建议

  1. 数据库就像你的房子:
  • 定期打扫(维护)
  • 合理布局(表结构)
  • 及时修补(优化)
  1. 定期备份数据:
  • 就像给重要文件拍照
  • 防止数据丢失
  1. 监控性能指标:
  • 就像查看身体健康指标
  • 发现问题及时处理

总结

记住这些关键点:

  1. 选对引擎:InnoDB适合重要数据,MyISAM适合简单查询
  1. 建好索引:但不是越多越好
  1. 优化查询:只查需要的数据
  1. 定期维护:保持数据库"健康"

最后的建议:性能优化不是一蹴而就的,需要在实践中不断积累经验。就像练武功,需要日积月累!加油!

你可能感兴趣的:(mysql,性能优化,笔记)