MySQL 优化方案大全

一、数据库设计优化

1. 表结构设计

  • 合理选择字段类型:
    • 使用最小满足需求的类型(如`TINYINT`代替`INT`)
    • 字符串类型优先`VARCHAR`,固定长度用`CHAR`
    • 时间类型用`TIMESTAMP`(4字节)或`DATETIME`(8字节)
  • 规范化设计:
bash 复制代码
 -- 反例:冗余设计
  CREATE TABLE orders (
    order_id INT,
    customer_name VARCHAR(100),  -- 冗余字段
    product_name VARCHAR(100)    -- 冗余字段
  );
  
  -- 正例:规范化设计
  CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    customer_id INT,
    product_id INT,
    FOREIGN KEY (customer_id) REFERENCES customers(customer_id),
    FOREIGN KEY (product_id) REFERENCES products(product_id)
  );

2. 索引优化

  • 索引设计原则:
    • 为WHERE、JOIN、ORDER BY字段建索引
    • 遵循最左前缀原则
    • 控制单表索引数量(通常不超过5-6个)
  • 复合索引示例:
bash 复制代码
  -- 适合查询:WHERE a=? AND b=? / WHERE a=? / WHERE a=? AND b=? AND c=?
  CREATE INDEX idx_a_b_c ON table_name(a, b, c);
  
  -- 不适合查询:WHERE b=? / WHERE c=? / WHERE b=? AND c=?

二、SQL查询优化

1. 查询语句优化

  • 避免全表扫描:
bash 复制代码
 -- 反例:未使用索引
  SELECT * FROM users WHERE DATE(create_time) = '2023-01-01';
  
  -- 正例:使用索引
  SELECT * FROM users 
  WHERE create_time >= '2023-01-01 00:00:00' 
    AND create_time <= '2023-01-01 23:59:59';
  • LIMIT优化:
bash 复制代码
 -- 反例:大偏移量查询
  SELECT * FROM articles ORDER BY id LIMIT 1000000, 10;
  
  -- 正例:使用索引覆盖+子查询
  SELECT * FROM articles 
  WHERE id >= (SELECT id FROM articles ORDER BY id LIMIT 1000000, 1)
  LIMIT 10;

2. JOIN优化

  • 小表驱动大表:
bash 复制代码
  -- 反例:大表驱动小表
  SELECT * FROM large_table l JOIN small_table s ON l.id = s.id;
  
  -- 正例:小表驱动大表
  SELECT * FROM small_table s JOIN large_table l ON s.id = l.id;
  • 避免子查询:
bash 复制代码
-- 反例:使用子查询
  SELECT * FROM users 
  WHERE dept_id IN (SELECT dept_id FROM departments WHERE status = 1);
  
  -- 正例:使用JOIN
  SELECT u.* FROM users u 
  JOIN departments d ON u.dept_id = d.dept_id 
  WHERE d.status = 1;

三、服务器配置优化

1. 关键参数调整

bash 复制代码
# my.cnf 配置示例(8核16G内存服务器)

[mysqld]
# 内存相关
innodb_buffer_pool_size = 12G  # 总内存的50-70%
key_buffer_size = 256M
sort_buffer_size = 4M
read_buffer_size = 4M
read_rnd_buffer_size = 4M

# 连接相关
max_connections = 500
thread_cache_size = 50
wait_timeout = 300

# InnoDB相关
innodb_log_file_size = 512M
innodb_flush_log_at_trx_commit = 1  # 重要数据安全
innodb_flush_method = O_DIRECT
innodb_file_per_table = ON

2. 监控与调优工具

  • 慢查询日志:
bash 复制代码
  SET GLOBAL slow_query_log = 'ON';
  SET GLOBAL long_query_time = 1;  -- 超过1秒记录
  SET GLOBAL slow_query_log_file = '/var/log/mysql/mysql-slow.log';
  • 性能分析:
bash 复制代码
 -- 查看当前会话执行计划
  EXPLAIN SELECT * FROM users WHERE username = 'test';
  
  -- 8.0+版本性能分析
  EXPLAIN ANALYZE SELECT * FROM orders WHERE amount > 1000;

四、高可用与扩展方案

1. 读写分离

bash 复制代码
graph TD
    A[应用] -->|写请求| B[Master]
    A -->|读请求| C[Slave1]
    A -->|读请求| D[Slave2]

2. 分库分表策略

  • 垂直分库:按业务拆分(用户库、订单库)
  • 水平分表:
bash 复制代码
  -- 按用户ID哈希分表
  CREATE TABLE user_0 (id BIGINT PRIMARY KEY, ...);
  CREATE TABLE user_1 (id BIGINT PRIMARY KEY, ...);
  
  -- 路由计算
  table_num = user_id % 2;

五、日常维护建议

1. 定期维护:

bash 复制代码
   -- 优化表(MyISAM)
   OPTIMIZE TABLE large_table;
   
   -- 分析表(更新索引统计信息)
   ANALYZE TABLE frequently_updated_table;

2. 数据归档:

bash 复制代码
  -- 将历史数据迁移到归档表
   INSERT INTO orders_archive 
   SELECT * FROM orders WHERE create_time < '2022-01-01';
   
   DELETE FROM orders WHERE create_time < '2022-01-01';

3. 备份策略:

bash 复制代码
  # mysqldump示例
   mysqldump -uroot -p --single-transaction --master-data=2 db_name > backup.sql
   
   # 物理备份工具
   xtrabackup --backup --target-dir=/backup/mysql/

通过以上优化方案的综合应用,可以显著提升MySQL数据库的性能和稳定性。实际应用中需要根据具体业务场景选择合适的优化策略。

相关推荐
在未来等你1 小时前
SQL进阶之旅 Day 21:临时表与内存表应用
sql·mysql·postgresql·database·temporary-table·memory-table·sql-optimization
敖云岚2 小时前
【Redis】分布式锁的介绍与演进之路
数据库·redis·分布式
LUCIAZZZ2 小时前
HikariCP数据库连接池原理解析
java·jvm·数据库·spring·springboot·线程池·连接池
我在北京coding3 小时前
300道GaussDB(WMS)题目及答案。
数据库·gaussdb
小Tomkk3 小时前
阿里云 RDS mysql 5.7 怎么 添加白名单 并链接数据库
数据库·mysql·阿里云
明月醉窗台4 小时前
qt使用笔记二:main.cpp详解
数据库·笔记·qt
沉到海底去吧Go4 小时前
【图片自动识别改名】识别图片中的文字并批量改名的工具,根据文字对图片批量改名,基于QT和腾讯OCR识别的实现方案
数据库·qt·ocr·图片识别自动改名·图片区域识别改名·pdf识别改名
老纪的技术唠嗑局4 小时前
重剑无锋,大巧不工 —— OceanBase 中的 Nest Loop Join 使用技巧分享
数据库·sql
未来之窗软件服务5 小时前
JAVASCRIPT 前端数据库-V6--仙盟数据库架构-—-—仙盟创梦IDE
数据库·数据库架构·仙盟创梦ide·东方仙盟·东方仙盟数据库
寒山李白5 小时前
MySQL复杂SQL(多表联查/子查询)详细讲解
sql·mysql·子查询·多表联查