15个SQL优化的技巧

  1. 避免使用SELECT *:在查询时,只选择需要的列,而不是使用SELECT *。这样可以减少不必要的数据查询和传输。

    sql 复制代码
    SELECT name, age FROM user WHERE id = 1;
  2. 使用UNION ALL代替UNION :使用UNION ALL来获取所有数据,包括重复的,以避免UNION的排重操作,从而减少CPU资源消耗。

    sql 复制代码
    (SELECT * FROM user WHERE id = 1)
    UNION ALL
    (SELECT * FROM user WHERE id = 2);
  3. 小表驱动大表 :使用小表的数据集来驱动大表的数据集,例如使用INEXISTS。根据实际情况选择适合的关键字。

    sql 复制代码
    SELECT * FROM order WHERE user_id IN (SELECT id FROM user WHERE status = 1);
  4. 批量操作:批量插入或更新数据,以减少数据库请求次数,提升性能。

    sql 复制代码
    INSERT INTO order(id, code, user_id) VALUES(123, '001', 100), (124, '002', 100), (125, '003', 101);
  5. 多用LIMIT :使用LIMIT来限制查询结果的数量,提高查询效率。同时,在删除或修改操作中使用LIMIT以避免误操作。

    sql 复制代码
    SELECT id, create_date FROM order WHERE user_id = 123 ORDER BY create_date ASC LIMIT 1;
  6. 限制IN子句中的值 :对IN子句中的值进行限制,避免查询大量数据导致接口超时。

    sql 复制代码
    SELECT id, name FROM category WHERE id IN (1, 2, 3...100) LIMIT 500;
  7. 增量查询:通过条件限制,每次只查询部分数据,提高同步效率。

    sql 复制代码
    SELECT * FROM user WHERE id > #{lastId} AND create_time >= #{lastCreateTime} LIMIT 100;
  8. 高效的分页 :使用LIMIT进行分页时,对于大数据量的表,使用ID范围查询代替偏移量分页。

    sql 复制代码
    SELECT id, name, age FROM user WHERE id > 1000000 LIMIT 20;
  9. 用连接查询代替子查询:使用连接查询代替子查询,减少临时表的创建和删除,提高查询效率。

    sql 复制代码
    SELECT o.* FROM order o INNER JOIN user u ON o.user_id = u.id WHERE u.status = 1;
  10. 控制JOIN表的数量 :控制JOIN表的数量,避免复杂的索引选择和性能消耗。

    sql 复制代码
    SELECT a.name, b.name, c.name FROM a INNER JOIN b ON a.id = b.a_id INNER JOIN c ON c.b_id = b.id;
  11. 注意JOIN的使用 :使用INNER JOIN时,小表驱动大表;使用LEFT JOIN时,注意左边应为小表。

    sql 复制代码
    SELECT o.id, o.code, u.name FROM order o INNER JOIN user u ON o.user_id = u.id WHERE u.status = 1;
  12. 控制索引的数量:合理控制索引数量,避免过多的索引导致性能消耗。

  13. 选择合理的字段类型 :根据数据特点选择合适的字段类型,如CHARVARCHAR,以及数字类型和字符串类型的选择。

    sql 复制代码
    ALTER TABLE order ADD COLUMN code CHAR(20) NOT NULL;
  14. 提升GROUP BY的效率 :在GROUP BY前使用WHERE条件过滤数据,减少分组操作的数据量。

    sql 复制代码
    SELECT user_id, user_name FROM order WHERE user_id <= 200 GROUP BY user_id;
  15. 索引优化 :使用EXPLAIN命令检查SQL语句是否走索引,避免索引失效,并在必要时使用FORCE INDEX强制使用特定索引。

    sql 复制代码
    EXPLAIN SELECT * FROM `order` WHERE code='002';
相关推荐
skiy14 小时前
Spring Framework 中文官方文档
java·后端·spring
jserTang14 小时前
Claude Code 源码深度解析 - 前言
前端·javascript·后端
清溪54915 小时前
Damn Vulnerable Web Application(中)
后端
清溪54915 小时前
Damn Vulnerable Web Application(上)
后端
掘金码甲哥15 小时前
AI编程智能体登味太浓了,必须治一治!
后端
StackNoOverflow15 小时前
SpringCloud的声明式服务调用 Feign 全面解析
后端·spring·spring cloud
爪洼传承人15 小时前
AI工具MCP的配置,慢sql优化
android·数据库·sql
木心术115 小时前
RESTful API设计最佳实践:构建可扩展的后端服务
后端·restful
Jooolin15 小时前
把 OpenClaw 接进电商后台之后,我对 AI 落地这件事的理解变了
后端·ai编程
Aloudata15 小时前
PL/SQL 存储过程血缘解析指南:攻克数据治理的「最后堡垒」
数据库·sql·数据治理·数据管理·元数据·数据血缘