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


相关推荐: Swift中循环语句中的转移语句 break 和 continue  iOS验证手机号的正则表达式  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  浅析上传头像示例及其注意事项  如何用搬瓦工VPS快速搭建个人网站?  Laravel Blade模板引擎语法_Laravel Blade布局继承用法  Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案  百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧  Laravel API路由如何设计_Laravel构建RESTful API的路由最佳实践  免费视频制作网站,更新又快又好的免费电影网站?  高防服务器租用首荐平台,企业级优惠套餐快速部署  php在windows下怎么调试_phpwindows环境调试操作说明【操作】  微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】  作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】  Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】  大型企业网站制作流程,做网站需要注册公司吗?  如何选择PHP开源工具快速搭建网站?  如何快速查询网址的建站时间与历史轨迹?  使用PHP下载CSS文件中的所有图片【几行代码即可实现】  bing浏览器学术搜索入口_bing学术文献检索地址  公司网站制作价格怎么算,公司办个官网需要多少钱?  Laravel如何实现文件上传和存储?(本地与S3配置)  瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口  php 三元运算符实例详细介绍  如何快速选择适合个人网站的云服务器配置?  如何快速生成橙子建站落地页链接?  Laravel如何优化应用性能?(缓存和优化命令)  音乐网站服务器如何优化API响应速度?  JavaScript如何操作视频_媒体API怎么控制播放  Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】  Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法  Laravel如何使用.env文件管理环境变量?(最佳实践)  Laravel如何实现数据库事务?(DB Facade示例)  Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门  香港服务器WordPress建站指南:SEO优化与高效部署策略  香港服务器建站指南:免备案优势与SEO优化技巧全解析  Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理  香港服务器选型指南:免备案配置与高效建站方案解析  Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)  再谈Python中的字符串与字符编码(推荐)  Win11任务栏卡死怎么办 Windows11任务栏无反应解决方法【教程】  Laravel如何处理表单验证?(Requests代码示例)  Windows Hello人脸识别突然无法使用  如何快速辨别茅台真假?关键步骤解析  Python正则表达式进阶教程_复杂匹配与分组替换解析  Python并发异常传播_错误处理解析【教程】  Laravel怎么实现微信登录_Laravel Socialite第三方登录集成  详解Android——蓝牙技术 带你实现终端间数据传输