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

优化慢sql

1. 添加索引

场景:当查询涉及复杂的条件判断且没有合适的索引时,可以通过添加索引来加速查询速度。
示例
假设有一个users表,包含id, name, email, address字段,经常根据nameaddress进行查询。

CREATE INDEX idx_users_name ON users(name);
CREATE INDEX idx_users_address ON users(address);

2. 使用 EXPLAIN 分析 SQL 执行计划

场景:通过EXPLAIN命令查看SQL执行计划,找出潜在的性能瓶颈。
示例

EXPLAIN SELECT * FROM users WHERE name = 'John Doe';

3. 优化 JOIN 查询

场景:JOIN操作可能会导致大量的数据扫描,尤其是在没有合适索引的情况下。
示例

SELECT u.name, o.order_date 
FROM users u 
JOIN orders o ON u.id = o.user_id 
WHERE u.name = 'John Doe' AND o.order_date > '2024-01-01';

在这个例子中,可以确保users(id)orders(user_id)上有索引。

4. 减少 SELECT 列的数量

场景:减少SELECT语句中返回的列数量可以减少数据传输量,提高性能。
示例
从返回所有列改为只返回必要的列:

SELECT id, name FROM users WHERE id = 1;

5. 使用 LIMIT 限制结果集大小

场景:当不需要所有结果时,使用LIMIT可以显著减少返回的数据量。
示例

SELECT * FROM users ORDER BY id DESC LIMIT 10;

6. 优化子查询

场景:子查询可能导致多次查询,可以考虑将子查询替换为JOIN。
示例
将以下子查询:

SELECT * FROM users WHERE id IN (SELECT user_id FROM orders);

改为JOIN:

SELECT u.* FROM users u JOIN orders o ON u.id = o.user_id;

7. 使用分区

场景:对于大型表,可以使用分区来提高查询效率。
示例

CREATE TABLE sales (
    sale_id INT,
    sale_date DATE,
    amount DECIMAL(10,2)
) PARTITION BY RANGE(YEAR(sale_date)) (
    PARTITION p0 VALUES LESS THAN (2020),
    PARTITION p1 VALUES LESS THAN (2025),
    PARTITION p2 VALUES LESS THAN MAXVALUE
);

8. 优化 GROUP BY 和 DISTINCT

场景:GROUP BY和DISTINCT会增加额外的排序和去重操作。
示例

SELECT COUNT(DISTINCT email) FROM users;

可以优化为:

SELECT COUNT(email) FROM users GROUP BY email HAVING COUNT(*) = 1;

9. 使用索引覆盖

场景:索引覆盖是指查询所需的所有数据都可以从索引树中获取,而无需访问实际的表数据。
示例

SELECT name, address FROM users WHERE id = 1;

确保users(id, name, address)上有一个复合索引。

10. 调整 MySQL 配置参数

场景:调整MySQL配置参数以适应特定的工作负载。
示例
增加innodb_buffer_pool_size来提高InnoDB表的性能:

[mysqld]
innodb_buffer_pool_size = 1G

http://www.kler.cn/a/280888.html

相关文章:

  • 计算机基础复习8.28
  • [Linux#46][线程->网络] 单例模式 | 饿汉与懒汉 | 自旋锁 |读写锁 | 网络基础 | 书单
  • 【Java 设计模式】Business Delegate 模式:简化业务服务交互
  • 大数据面试-Zookeeper
  • 流媒体协议之RTCP
  • kafka发送消息-自定义消息发送的拦截器
  • 浏览器插件利器--allWebPluginV2.0.0.18-alpha版发布
  • 游戏开发设计模式之桥接模式
  • 王立铭脑科学50讲:35,人类语言,我们如何发明和表达思想
  • linux安装mysql数据库,含公网链接(有网络带网安装)
  • Python策略模式:灵活应对多变的业务逻辑
  • OpenAI remove key access while using AAD authentication
  • LabVIEW字符串的正常显示和16进制显示的区别
  • 力扣376-摆动序列(java详细题解)
  • Meta AI动画生成功能的规模化部署与优化策略
  • 爬虫可以通过那几种方式更换IP爬取
  • (二) 初入MySQL 【数据库管理】
  • LeetCode面试题Day19|LC104 二叉树的最大深度
  • RASA使用长文记录以及一些bug整理
  • JAVA 17中List按照组合键分组