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';
相关推荐
西安邮电大学3 分钟前
Kafka保证消息顺序性
java·后端·kafka
贺国亚8 分钟前
RAG 检索增强 · 向量库与 Chunking
后端·面试
逍遥德16 分钟前
PostgreSQL --- JSON 函数详解
数据库·sql·postgresql·json
晓杰'18 分钟前
从0到1实现Balatro游戏后端(5):得分计算与单局结算流程实现
后端·typescript·node.js·游戏开发·项目实战·nestjs·webscoket
小马爱打代码22 分钟前
MySQL高可用与扩展:主从复制、读写分离、分库分表
服务器·数据库·mysql
IT策士26 分钟前
第16篇 实战:用 Docker Compose 编排 WordPress 与 MySQL
mysql·docker·容器
j7~28 分钟前
【MYSQL】 复合查询--详解(重点)
数据库·mysql·子查询·多表查询·自链接·合并查询
减瓦33 分钟前
Jackson 自定义反序列化器的类型不匹配陷阱
java·后端
HLAIA光子35 分钟前
计网面试躲不掉的三连问:OSI七层、HTTPS握手、REST还是RPC
后端·网络协议
JAVA社区40 分钟前
Java高级全套教程(九)—— SpringCloud超详细实战详解
java·开发语言·后端·spring cloud·面试·职场和发展