-
避免使用SELECT *:在查询时,只选择需要的列,而不是使用
SELECT *。这样可以减少不必要的数据查询和传输。sqlSELECT name, age FROM user WHERE id = 1; -
使用UNION ALL代替UNION :使用
UNION ALL来获取所有数据,包括重复的,以避免UNION的排重操作,从而减少CPU资源消耗。sql(SELECT * FROM user WHERE id = 1) UNION ALL (SELECT * FROM user WHERE id = 2); -
小表驱动大表 :使用小表的数据集来驱动大表的数据集,例如使用
IN或EXISTS。根据实际情况选择适合的关键字。sqlSELECT * FROM order WHERE user_id IN (SELECT id FROM user WHERE status = 1); -
批量操作:批量插入或更新数据,以减少数据库请求次数,提升性能。
sqlINSERT INTO order(id, code, user_id) VALUES(123, '001', 100), (124, '002', 100), (125, '003', 101); -
多用LIMIT :使用
LIMIT来限制查询结果的数量,提高查询效率。同时,在删除或修改操作中使用LIMIT以避免误操作。sqlSELECT id, create_date FROM order WHERE user_id = 123 ORDER BY create_date ASC LIMIT 1; -
限制IN子句中的值 :对
IN子句中的值进行限制,避免查询大量数据导致接口超时。sqlSELECT id, name FROM category WHERE id IN (1, 2, 3...100) LIMIT 500; -
增量查询:通过条件限制,每次只查询部分数据,提高同步效率。
sqlSELECT * FROM user WHERE id > #{lastId} AND create_time >= #{lastCreateTime} LIMIT 100; -
高效的分页 :使用
LIMIT进行分页时,对于大数据量的表,使用ID范围查询代替偏移量分页。sqlSELECT id, name, age FROM user WHERE id > 1000000 LIMIT 20; -
用连接查询代替子查询:使用连接查询代替子查询,减少临时表的创建和删除,提高查询效率。
sqlSELECT o.* FROM order o INNER JOIN user u ON o.user_id = u.id WHERE u.status = 1; -
控制JOIN表的数量 :控制
JOIN表的数量,避免复杂的索引选择和性能消耗。sqlSELECT 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; -
注意JOIN的使用 :使用
INNER JOIN时,小表驱动大表;使用LEFT JOIN时,注意左边应为小表。sqlSELECT o.id, o.code, u.name FROM order o INNER JOIN user u ON o.user_id = u.id WHERE u.status = 1; -
控制索引的数量:合理控制索引数量,避免过多的索引导致性能消耗。
-
选择合理的字段类型 :根据数据特点选择合适的字段类型,如
CHAR和VARCHAR,以及数字类型和字符串类型的选择。sqlALTER TABLE order ADD COLUMN code CHAR(20) NOT NULL; -
提升GROUP BY的效率 :在
GROUP BY前使用WHERE条件过滤数据,减少分组操作的数据量。sqlSELECT user_id, user_name FROM order WHERE user_id <= 200 GROUP BY user_id; -
索引优化 :使用
EXPLAIN命令检查SQL语句是否走索引,避免索引失效,并在必要时使用FORCE INDEX强制使用特定索引。sqlEXPLAIN SELECT * FROM `order` WHERE code='002';
15个SQL优化的技巧
写bug写bug2024-06-27 18:55
相关推荐
ping某8 小时前
为什么 Nginx 明明监听了 80,转发后端时却用了 4xxxx 端口?JustHappy8 小时前
我汇总了身边朋友的经历才发现,其实第一份实习是最难找的......uhakadotcom8 小时前
在python 的 工程化架构中 ,什么是 薄包装器层?用户14748530797412 小时前
CodeX使用Skill生成游戏美术和音乐资源,一分钟入门Melody12313 小时前
用 abort 中断 AI 流式请求,我之前做错了云技纵横13 小时前
唯一索引 INSERT 死锁实战:5 秒复现交叉插入的 S 锁循环等待沉默王二13 小时前
面试官:RAG 不用向量数据库,用 MySQL 硬扛?我:100 万向量不是很轻松?onething36513 小时前
Spring Boot + Spring AI 从入门到实战:7天转型计划 Day 5 —— SSE 流式输出 + 打字机效果一个做软件开发的牛马13 小时前
MyBatis-Plus 从零实战:完整搭建可运行 Demo,BaseMapper 零 SQL、Wrapper 条件构造、分页插件与代码生成器详解码事漫谈13 小时前
AI 编程的「三体」架构:OpenSpec + Superpowers + GStack 如何让一个开发者撑起整个研发团队