当前位置: 首页 > ai >正文

MySQL性能常用优化技巧总结

1. 索引优化

创建合适的索引

-- 为常用查询条件创建索引
ALTER TABLE users ADD INDEX idx_email (email);
ALTER TABLE orders ADD INDEX idx_customer_date (customer_id, order_date);

避免索引失效的情况

-- 避免在索引列上使用函数
SELECT * FROM users WHERE DATE(create_time) = '2023-01-01'; -- 不好
SELECT * FROM users WHERE create_time BETWEEN '2023-01-01 00:00:00' AND '2023-01-01 23:59:59'; -- 更好-- 避免使用不等于(!=或<>)
SELECT * FROM users WHERE status != 1; -- 可能导致索引失效

2. 查询优化

使用EXPLAIN分析查询

EXPLAIN SELECT * FROM orders WHERE customer_id = 100 AND status = 'completed';

只查询需要的列

-- 不好
SELECT * FROM users WHERE id = 100;-- 更好
SELECT id, name, email FROM users WHERE id = 100;

使用JOIN优化

-- 确保JOIN字段有索引
SELECT o.order_id, c.customer_name 
FROM orders o 
JOIN customers c ON o.customer_id = c.customer_id; -- 确保customer_id在两个表都有索引

3. 表结构优化

选择合适的数据类型

-- 使用最小的合适数据类型
-- 不好
CREATE TABLE products (id BIGINT, -- 可能过大price DECIMAL(20,2) -- 精度过高
);-- 更好
CREATE TABLE products (id INT UNSIGNED,price DECIMAL(10,2)
);

规范化与反规范化

-- 有时适当反规范化可以提高查询性能
-- 原始规范化设计
SELECT o.*, u.name, u.email 
FROM orders o 
JOIN users u ON o.user_id = u.id;-- 反规范化设计(在orders表中存储用户名和邮箱)
SELECT o.* 
FROM orders o 
WHERE o.user_id = 100; -- 不需要JOIN

4. 配置优化

调整缓冲池大小

-- 在my.cnf/my.ini中设置
[mysqld]
innodb_buffer_pool_size = 4G  # 通常设置为可用内存的70-80%

调整连接数

-- 在my.cnf/my.ini中设置
max_connections = 200

5. 批量操作优化

使用批量插入

-- 不好
INSERT INTO users (name, email) VALUES ('user1', 'user1@example.com');
INSERT INTO users (name, email) VALUES ('user2', 'user2@example.com');-- 更好
INSERT INTO users (name, email) VALUES 
('user1', 'user1@example.com'),
('user2', 'user2@example.com');

批量更新优化

-- 不好
UPDATE products SET stock = stock - 1 WHERE id = 1;
UPDATE products SET stock = stock - 1 WHERE id = 2;-- 更好
UPDATE products SET stock = stock - 1 WHERE id IN (1, 2);

6. 分区和分表

使用表分区

-- 按日期范围分区
CREATE TABLE logs (id INT,log_time DATETIME,message TEXT
) PARTITION BY RANGE (YEAR(log_time)) (PARTITION p2020 VALUES LESS THAN (2021),PARTITION p2021 VALUES LESS THAN (2022),PARTITION p2022 VALUES LESS THAN (2023),PARTITION pmax VALUES LESS THAN MAXVALUE
);

7. 其他优化技巧

使用延迟关联

-- 对于大表分页查询
-- 原始查询(性能差)
SELECT * FROM large_table ORDER BY create_time DESC LIMIT 100000, 10;-- 延迟关联(性能更好)
SELECT t.* FROM large_table t
JOIN (SELECT id FROM large_table ORDER BY create_time DESC LIMIT 100000, 10) tmp
ON t.id = tmp.id;

使用覆盖索引

-- 创建覆盖索引
ALTER TABLE orders ADD INDEX idx_covering (customer_id, status, order_date);-- 查询可以使用覆盖索引
SELECT customer_id, status, order_date FROM orders 
WHERE customer_id = 100 AND status = 'completed';

8. 监控与维护

定期分析表

ANALYZE TABLE orders;

优化表

OPTIMIZE TABLE large_table;

监控慢查询

-- 启用慢查询日志
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1; -- 超过1秒的查询

这些优化技巧可以根据实际应用场景组合使用,通常需要结合EXPLAIN分析查询执行计划来确定最佳的优化策略。

http://www.xdnf.cn/news/1785.html

相关文章:

  • fpga系列 HDL:verilog latch在fpga中的作用 避免latch的常见做法
  • 优选算法第十讲:字符串
  • Typecho 访客统计插件最新版-前后台统计图均可显示
  • 220V降24V500mA非隔离恒压芯片WT5110
  • m365是什么,和o365的区别
  • word删除空白页的方面
  • Java技术体系的主要产品线详解
  • YOLOv5改进(十)-- 轻量化模型MobileNetv4
  • 基于javaweb的SpringBoot校园服务平台系统设计与实现(源码+文档+部署讲解)
  • JWT(JSON Web Token)用户认证
  • DeepSeek 部署中的常见问题及解决方案全解析
  • 工业自动化中的高效桥梁:EtherCAT转Profinet网关在封装环节的应用
  • 二叉树的最大深度
  • Godot开发2D冒险游戏——第一节:主角登场!
  • NEWport太阳光模拟器与AVANTES光谱仪与太阳能模拟器光谱匹配度检测应用
  • Python实现异步编程的重要方式【协程(Coroutine)函数】(内含详细案例)
  • 计算机组成与体系结构:直接内存映射(Direct Memory Mapping)
  • [flutter]切换国内源(window)
  • 作用域插槽 父子组件插槽传值
  • 区分指向常量的指针、常指针和指向常量的常指针
  • OCP考试需要注意什么?
  • Python判断文本是不是注释方法
  • SAM12
  • 虚拟机系统介绍
  • 机器学习项目管理:团队协作与版本控制
  • Concepts (C++20)
  • 【Linux】网络基础和socket(4)
  • 访问者模式
  • HOJ.单词统计
  • 系统架构师2025年论文《系统架构风格2》