写出高效SQL的3个肌肉记忆:从新手到老手的习惯养成

本文涉及的产品
RDS AI 助手,专业版
PolarDB Agent Express,2核4GB
PolarDB Agent Flow,2核4GB
简介: 本文总结3个实战派SQL“肌肉记忆”:①WHERE条件中索引字段不加工(禁函数/运算/隐式转换);②存在性检查优先用EXISTS而非IN或JOIN+DISTINCT;③分页用游标、批量操作限流1000行、修改前先SELECT验证。全是踩坑提炼的稳产技巧!

大家好,我是小耶。前面两周讲了各种慢查询案例,今天不展开新知识点,只总结三个最实用的“肌肉记忆”。不是我编的,是我踩坑踩出来的。

1 肌肉记忆一:WHERE条件里的字段绝不“加工”

核心​:索引列保持原样,不做任何变换。

错误写法 正确写法 原理
WHERE DATE(order_date) = '2026-05-01' WHERE order_date >= '2026-05-01' AND order_date < '2026-05-02' 函数让索引失效,改范围查询
WHERE price + 10 > 100 WHERE price > 90 运算移到右边
WHERE phone = 13812345678(phone是varchar) WHERE phone = '13812345678' 类型不匹配触发隐式转换

养成习惯​:写完WHERE条件后,检查等号左边有没有函数、运算或类型不一致。

2 肌肉记忆二:存在性检查用EXISTS,别滥用IN或JOIN+DISTINCT

很多新人看到“查A表中存在于B表的数据”,第一反应是INJOIN。但在MySQL中,EXISTS通常是最优解:

-- ✅ 推荐写法(存在性检查)
SELECT * FROM users u 
WHERE EXISTS (SELECT 1 FROM orders o WHERE o.user_id = u.user_id);

-- ❌ 可能有临时表开销的写法
SELECT DISTINCT u.* FROM users u JOIN orders o ON u.user_id = o.user_id;

为什么?
EXISTS一旦在内层找到匹配就立即停止扫描,且不需要生成去重临时表。JOIN可能产生重复行,必须加DISTINCT,而DISTINCT在大表上可能创建磁盘临时表,反而更慢。

什么时候用JOIN? 需要同时返回两张表的字段时。单纯判断存在,无脑用EXISTS

3 肌肉记忆三:分页和批量操作必须“刹车”

3.1 分页不用 LIMIT M,N 深分页

-- ❌ 深分页:扫描100万行再取10行
SELECT * FROM orders ORDER BY id LIMIT 1000000, 10;

-- ✅ 游标分页:记录上一页最后id
SELECT * FROM orders WHERE id > 上一页最大id ORDER BY id LIMIT 10;

3.2 批量删除/更新一次不超过1000行

-- ❌ 一次性删除几百万行,长事务锁表
DELETE FROM logs WHERE created_at < '2025-01-01';

-- ✅ 分批删除,循环执行
DELETE FROM logs WHERE created_at < '2025-01-01' LIMIT 1000;

3.3 修改数据前,先 SELECT 验证影响行数

BEGIN;
SELECT COUNT(*) FROM orders WHERE status = '测试';
-- 确认行数正确再执行
DELETE FROM orders WHERE status = '测试';
COMMIT;

4 总结:三个习惯能让你避免多少坑?

  • 不对WHERE字段“加工”:避免90%的索引失效问题。
  • 存在性检查用EXISTS:避免不必要的JOIN + DISTINCT临时表开销。
  • 分页+批量加“刹车”:避免深分页、长事务、锁表事故。

这些都不是高深理论,而是每次写SQL时多看一眼就能做到的事。养成肌肉记忆,你的代码会更稳,加班会更少。

小耶在手,SQL 不愁。

还有什么想了解的,欢迎留言!小耶一定知无不言言无不尽……我们下次见~

相关文章
|
1月前
|
关系型数据库 MySQL 测试技术
JOIN、IN、EXISTS谁最快?实测三种写法性能差异与执行计划深度剖析
本文用MySQL 8.0实测拆解`IN`/`EXISTS`/`JOIN`子查询性能:从执行计划、半连接优化、临时表开销等底层原理出发,结合10万+100万数据实测(`EXISTS`最快95ms),给出三条选型铁律——告别盲从“最佳实践”,只选最适配业务与数据的写法!
|
1月前
|
SQL 关系型数据库 MySQL
批量操作性能飙升:从30秒到1秒的三种实战方法
业务系统中经常需要批量导入或更新大量数据(如Excel上传、定时同步)。许多开发人员采用循环单条执行的方式,导致1万条数据耗时30秒以上,严重影响用户体验。本文从数据库IO、事务开销、锁竞争三个角度分析单条操作的性能瓶颈,并给出三种优化方案:批量INSERT、LOAD DATA文件导入、批量UPDATE用临时表。每种方案均附实测数据对比与适用场景说明,帮助读者在1万\~100万行级别批量操作中选择最优策略。
|
1月前
|
SQL 运维 关系型数据库
DBA必备技能:MySQL误删恢复完全指南(全量备份+binlog回放)
本文详解误删数据(如`DELETE FROM orders`)后的紧急恢复三步法:查Binlog→临时库回放→差异导回,并附4条血泪预防措施。不讲段子,只教能救命的操作!
|
1月前
|
SQL 关系型数据库 MySQL
MySQL慢查询诊断实战:从10秒到0.1秒,我的5步排障法
数据库小学妹分享慢查询优化实战:从10秒降至0.08秒!详解「发现→收集→分析→优化→验证」5步排障法,覆盖慢日志配置、EXPLAIN进阶、索引失效场景、JOIN与分页优化等核心技巧,附真实案例与速查表。
|
13天前
|
SQL 安全 Java
SQL注入防御指南:从漏洞原理到实战防护,我的安全避坑血泪史
数据库小学妹带你秒懂SQL注入防护!📌核心关键词:SQL注入、参数化查询、预编译、WAF。用餐厅点餐类比攻击原理,详解布尔盲注、时间延迟、联合查询三种手法;手把手演示Python/Java/PHP/C#安全写法;构建“参数化(必选)+输入校验(辅助)+最小权限(兜底)”三层防御体系,并推荐WAF、ORM与扫描工具。安全无小事,从杜绝字符串拼接开始!
|
1月前
|
JSON 关系型数据库 MySQL
MySQL 8.0这几个功能太实用了!5分钟帮你省下70%的代码量
MySQL 8.0重磅升级,实操利器全面登场:CTE简化嵌套与递归查询,JSON_TABLE直解析JSON为表,窗口函数赋能高效分析,不可见索引提供删除“后悔药”,强化密码策略保障企业安全——性能、安全、开发效率三重跃升。
|
1月前
|
存储 关系型数据库 MySQL
表太大,查询慢?分区表:让亿级数据飞起来!
MySQL分区表是大表优化利器,支持Range(按时间范围)、List(按离散值)、Hash(均匀散列)三种主流分区方式,通过分区裁剪显著提升查询性能与维护效率。逻辑统一、物理拆分,适用于千万级以上数据场景,但需合理选择分区键,避免小表滥用。
|
1月前
|
设计模式 人工智能 自然语言处理
企业级智能客服系统建设方案:多轮对话+RAG+人机协同深度解析
本文剖析企业级智能客服三大瓶颈,提出“多轮对话+RAG+人机协同”三位一体建设方案,详解瓴羊Quick Service如何实现有状态对话、企业级知识管线与共生式协同,打造可观测、可干预、可迭代的智能客服系统。(239字)
|
2月前
|
SQL 数据库
多表关联查询入门:LEFT JOIN、INNER JOIN一文搞懂|转行学DB第6天
本文通俗易懂地讲解了数据库多表查询的三种JOIN操作:INNER JOIN(内连接)只返回两表匹配的数据,适用于查询交集数据;LEFT JOIN(左连接)保留左表所有记录并匹配右表数据,适用于查询主表完整信息;RIGHT JOIN(右连接)则保留右表所有记录。
|
1月前
|
存储 弹性计算 人工智能
2026年阿里云优惠券领取及使用教程,新购、续费、升级可用!
阿里云2026年推出多类优惠券(代金券、满减券、折扣券),覆盖学生300元无门槛券、新用户10元满减、AI焕新季礼包等,适用于ECS、OSS等主流云产品,不支持域名及云市场商品。可通过权益中心、高校计划等入口领取,登录费用中心查看并结算时自动抵扣。
217 6