mysql函数如何配合索引使用_mysql查询优化方案

发布时间 - 2026-01-29 00:00:00    点击率:
使用YEAR()、DATE()等函数会导致索引失效,因函数破坏列值有序性;正确做法是用范围查询,如create_time >= '2025-01-01' AND create_time

WHERE 条件中用 YEAR()DATE()

函数会导致索引失效

MySQL 在执行查询时,如果在索引列上套用函数(比如 WHERE YEAR(create_time) = 2025),优化器无法直接定位索引 B+ 树中的范围,只能全表扫描。本质是:函数改变了原始值的有序性,索引失去“可比较性”。

  • ✅ 正确写法:WHERE create_time >= '2025-01-01' AND create_time (假设 create_time 有索引)
  • ❌ 错误写法:WHERE YEAR(create_time) = 2025WHERE DATE(create_time) = '2025-06-01'
  • ⚠️ 注意:即使 create_timeDATETIME 类型,DATE() 函数仍会触发隐式转换和索引跳过

LIKE 查询带前导通配符(%abc)无法走索引

索引是按字符串前缀有序存储的,LIKE '%abc' 必须从每个值末尾匹配,B+ 树无法跳过查找路径;而 LIKE 'abc%' 可以利用最左前缀快速定位起始位置。

  • ✅ 支持索引:WHERE name LIKE 'john%'(前提是 name 列有索引)
  • ❌ 不支持索引:WHERE name LIKE '%ohn'WHERE name LIKE '%oh%'
  • ? 替代方案:对模糊搜索需求高,考虑 FULLTEXT 索引或外部搜索引擎(如 Elasticsearch)

ORDER BYGROUP BY 必须严格匹配索引顺序才能避免 filesort

MySQL 使用索引完成排序或分组的前提是:索引字段顺序与 ORDER BYGROUP BY 子句完全一致,且不混用 ASC/DESC(8.0+ 支持混合,但需显式声明)。

  • ✅ 走索引排序:INDEX (a, b, c) + ORDER BY a, bORDER BY a DESC, b DESC
  • ❌ 触发 Using filesortORDER BY b, aORDER BY a ASC, b DESC(除非 MySQL 8.0+ 且索引已定义为 (a ASC, b DESC)
  • ⚠️ 特别注意:SELECT * + ORDER BY 索引列,若索引不是覆盖索引,仍需回表,性能取决于数据量和随机 IO 成本

函数索引(MySQL 8.0+)能解决部分表达式索引需求

MySQL 8.0 引入函数索引,允许对表达式建索引,比如对 UPPER(email)DATE(created_at) 建索引,让原本无法走索引的查询变成可索引查询。

  • ✅ 创建方式:CREATE INDEX idx_email_upper ON users ((UPPER(email)))
  • ✅ 查询生效:WHERE UPPER(email) = 'JOHN@EXAMPLE.COM'
  • ⚠️ 限制:函数索引只支持确定性函数;不能包含用户变量、存储函数、子查询;索引名必须用双括号包裹表达式
  • ⚠️ 注意:低版本(email_upper 字段并维护其值
索引是否生效,最终得看 EXPLAINkeyExtra 字段。很多人只看 type=ref 就以为没问题,却忽略了 Extra: Using where; Using filesort —— 这说明排序没走索引,实际仍是性能瓶颈。


# mysql  # ai  # 搜索引擎  # 隐式转换  # select  # date  # 字符串  # using  # elasticsearch  # 跳过  # 子句  # 很多人  # 仍是  # 不支持  # 只看  # 可以利用  # 如对  # 仍会  # 仍需 


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


相关推荐: 如何快速选择适合个人网站的云服务器配置?  Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】  奇安信“盘古石”团队突破 iOS 26.1 提权  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】  Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程  QQ浏览器网页版登录入口 个人中心在线进入  详解阿里云nginx服务器多站点的配置  Laravel如何处理表单验证?(Requests代码示例)  消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工  Laravel路由Route怎么设置_Laravel基础路由定义与参数传递规则【详解】  JS中对数组元素进行增删改移的方法总结  Laravel如何使用Gate和Policy进行授权?(权限控制)  bootstrap日历插件datetimepicker使用方法  PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)  Win11怎么设置默认图片查看器_Windows11照片应用关联设置  如何在服务器上三步完成建站并提升流量?  Python企业级消息系统教程_KafkaRabbitMQ高并发应用  Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO)  为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】  在线制作视频的网站有哪些,电脑如何制作视频短片?  Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录  Claude怎样写结构化提示词_Claude结构化提示词写法【教程】  如何登录建站主机?访问步骤全解析  HTML 中如何正确使用模板变量为元素的 name 属性赋值  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  Laravel如何生成和使用数据填充?(Seeder和Factory示例)  电商网站制作价格怎么算,网上拍卖流程以及规则?  如何在云主机快速搭建网站站点?  Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】  浅谈javascript alert和confirm的美化  Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言  新三国志曹操传主线渭水交兵攻略  Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面  使用spring连接及操作mongodb3.0实例  瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口  Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】  Laravel如何实现一对一模型关联?(Eloquent示例)  javascript事件捕获机制【深入分析IE和DOM中的事件模型】  教你用AI将一段旋律扩展成一首完整的曲子  Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】  Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践  如何用PHP工具快速搭建高效网站?  Python文件异常处理策略_健壮性说明【指导】  javascript基本数据类型及类型检测常用方法小结  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  如何生成腾讯云建站专用兑换码?  Laravel定时任务怎么设置_Laravel Crontab调度器配置  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  Linux系统运维自动化项目教程_Ansible批量管理实战