SQL 优化中最容易踩的坑

发布时间 - 2026-01-26 00:00:00    点击率:
对字段使用函数会导致索引失效,如YEAR(create_time)=2025;应改写为create_time>='2025-01-01' AND create_time

WHERE 条件里对字段用函数

这是最常导致索引失效的操作。比如写 WHERE YEAR(create_time) = 2025,哪怕 create_time 有索引,MySQL 也无法走索引范围扫描,只能全表扫描。

正确做法是把函数移到右边,让左边保持纯列名:

  • WHERE create_time >= '2025-01-01' AND create_time
  • 如果必须按年月分组统计,优先考虑在应用层或用生成列(MySQL 5.7+)加索引
  • PostgreSQL 中 EXTRACT(YEAR FROM create_time) 同样会跳过索引,处理方式类似

SELECT * 在大宽表 + 分页场景下

当表有 50+ 字段、单行超 10KB,而业务只读其中 3 个字段时,SELECT * 会让网络传输、内存拷贝、临时表排序成本陡增,尤其配合 LIMIT 10000,20 这类深分页时更明显。

实操建议:

  • 明确写出需要的字段,如 SELECT id, title, updated_at
  • 深分页改用游标(cursor-based pagination):用上一页最后的 updated_atid 作为下一页查询条件
  • 避免在 ORDER BY 字段上存在大量重复值(比如多个记录 status = 'done'),否则 ORDER BY + LIMIT 可能因排序不稳导致漏数据

JOIN 时没加 ON 条件或条件写错

漏写 ON 会变成笛卡尔积,1 万行 × 1 万行 = 1 亿行中间结果;写错条件(比如用 = 比较 NULL 值、或类型不一致隐式转换)则可能让优化器误判执行计划。

检查要点:

  • 所有 JOIN 必须显式带 ON,禁止依赖 WHERE 补条件(尤其外连接)
  • 确认关联字段类型完全一致:user_id INTlog.user_id VARCHAR 会导致索引失效 + 类型转换开销
  • EXPLAINtype 是否为 ALLindexrows 是否远超预期

ORDER BY + LIMIT 没覆盖索引

例如 SELECT * FROM

orders WHERE status = 'paid' ORDER BY created_at DESC LIMIT 20,如果只有 status 单列索引,MySQL 仍需回表排序;若建了 (status, created_at) 联合索引,就能直接索引扫描 + 索引有序性取前 20 条。

关键原则:

  • 联合索引顺序要匹配查询模式:等值条件字段在前,排序字段紧随其后
  • 如果同时有多个等值条件(如 WHERE a=1 AND b=2),把区分度高的字段放前面
  • ORDER BY 中混用 ASC/DESC(如 ORDER BY a ASC, b DESC)在 MySQL 8.0 之前无法用索引排序,需升级或调整逻辑

真正卡住 SQL 性能的,往往不是复杂算法,而是这些看似无害的写法。每一条都容易被忽略,但叠加起来会让 QPS 断崖下跌——尤其是上线后流量一上来,慢查询日志里全是它们的名字。


# mysql  # ai  # 隐式转换  # sql  # NULL  # select  # int  # 类型转换  # 算法  # postgresql  # 分页  # 多个  # 笛卡尔  # 会让  # 这是  # 尤其是  # 就能  # 下一页  # 这类  # 能让 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 利用vue写todolist单页应用  Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布  千库网官网入口推荐 千库网设计创意平台入口  Laravel如何创建和注册中间件_Laravel中间件编写与应用流程  EditPlus中的正则表达式 实战(2)  新三国志曹操传主线渭水交兵攻略  Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】  Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  如何撰写建站申请书?关键要点有哪些?  Laravel项目怎么部署到Linux_Laravel Nginx配置详解  iOS发送验证码倒计时应用  Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧  微信小程序 input输入框控件详解及实例(多种示例)  如何在搬瓦工VPS快速搭建网站?  Laravel如何使用Gate和Policy进行授权?(权限控制)  Laravel中的withCount方法怎么高效统计关联模型数量  HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】  如何利用DOS批处理实现定时关机操作详解  北京专业网站制作设计师招聘,北京白云观官方网站?  Linux安全能力提升路径_长期防护思维说明【指导】  Laravel如何编写单元测试和功能测试?(PHPUnit示例)  Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】  PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】  Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践  通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】  如何在VPS电脑上快速搭建网站?  如何快速查询域名建站关键信息?  Laravel如何配置Horizon来管理队列?(安装和使用)  jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】  香港服务器建站指南:免备案优势与SEO优化技巧全解析  javascript读取文本节点方法小结  EditPlus中的正则表达式实战(5)  HTML透明颜色代码怎么让图片透明_给img元素加透明色的技巧【方法】  javascript中对象的定义、使用以及对象和原型链操作小结  高防服务器租用首荐平台,企业级优惠套餐快速部署  百度浏览器如何管理插件 百度浏览器插件管理方法  再谈Python中的字符串与字符编码(推荐)  如何在香港免费服务器上快速搭建网站?  Laravel如何实现密码重置功能_Laravel密码找回与重置流程  Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件  如何在服务器上配置二级域名建站?  ,交易猫的商品怎么发布到网站上去?  Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南  在centOS 7安装mysql 5.7的详细教程  Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  如何快速搭建高效服务器建站系统?  Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程