mysql函数如何配合索引使用_mysql查询优化方案
发布时间 - 2026-01-29 00:00:00 点击率:次使用YEAR()、DATE()等函数会导致索引失效,因函数破坏列值有序性;正确做法是用范围查询,如create_time >= '2025-01-01' AND create_timeWHERE 条件中用
YEAR()、DATE()等函数会导致索引失效
MySQL 在执行查询时,如果在索引列上套用函数(比如
WHERE YEAR(create_time) = 2025),优化器无法直接定位索引 B+ 树中的范围,只能全表扫描。本质是:函数改变了原始值的有序性,索引失去“可比较性”。
- ✅ 正确写法:
WHERE create_time >= '2025-01-01' AND create_time (假设create_time有索引)- ❌ 错误写法:
WHERE YEAR(create_time) = 2025或WHERE DATE(create_time) = '2025-06-01'- ⚠️ 注意:即使
create_time是DATETIME类型,DATE()函数仍会触发隐式转换和索引跳过
LIKE查询带前导通配符(%abc)无法走索引索引是按字符串前缀有序存储的,
LIKE '%abc'必须从每个值末尾匹配,B+ 树无法跳过查找路径;而LIKE 'abc%'可以利用最左前缀快速定位起始位置。
- ✅ 支持索引:
WHERE name LIKE 'john%'(前提是name列有索引)- ❌ 不支持索引:
WHERE name LIKE '%ohn'或WHERE name LIKE '%oh%'- ? 替代方案:对模糊搜索需求高,考虑
FULLTEXT索引或外部搜索引擎(如 Elasticsearch)
ORDER BY和GROUP BY必须严格匹配索引顺序才能避免 filesortMySQL 使用索引完成排序或分组的前提是:索引字段顺序与
ORDER BY或GROUP BY子句完全一致,且不混用 ASC/DESC(8.0+ 支持混合,但需显式声明)。
- ✅ 走索引排序:
INDEX (a, b, c)+ORDER BY a, b或ORDER BY a DESC, b DESC- ❌ 触发
Using filesort:ORDER BY b, a或ORDER 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 字段并维护其值
EXPLAIN的key和Extra字段。很多人只看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批量管理实战


