SQL查询性能优化 - EXISTS、IN

从客户表(c1)中,找出所有状态为“2”的客户,并且要求存在另一个状态也为“2”、邮箱包含'customer'、手机号以'138'开头的同名客户。

将所有状态为“2”且满足存在性检查的最终结果,按照客户姓名 (c1.name)进行排序,然后为其分配一个连续的组序号 (group_seq)。

原sql

SELECT DENSE_RANK() OVER (ORDER BY c1.name) AS group_seq, c1.customer_id, c1.name, c1.email, c1.phone, c1.registration_date, c1.credit_limit, c1.status, c1.created_at FROM study_test.customers c1 WHERE c1.status = 2 AND c1.name in ( SELECT c2.name FROM study_test.customers c2 WHERE c2.status = 2 AND c2.email LIKE '%customer%' AND c2.phone LIKE '138%' AND c2.name = c1.name ) ORDER BY group_seq, c1.customer_id

优化后

优化后的 SQL 使用EXISTS,这通常比IN更有性能优势,特别是当子查询能利用索引时。

SELECT DENSE_RANK() OVER (ORDER BY c1.name) AS group_seq, c1.customer_id, c1.name, c1.email, c1.phone, c1.registration_date, c1.credit_limit, c1.status, c1.created_at FROM study_test.customers c1 WHERE c1.status = 2 AND EXISTS ( SELECT 1 FROM study_test.customers c2 WHERE c2.status = 2 AND c2.email LIKE '%customer%' AND c2.phone LIKE '138%' AND c2.name = c1.name ) ORDER BY group_seq, c1.customer_id; xml中 c2.status = 2 AND c2.email LIKE '%customer%' AND c2.phone LIKE '138%'

这3个条件是可选,生产环境下怎么设置索引呢,那些索引必须设置,那些可以选择设置,那些没必要设置,详细介绍

WHERE c2.status = 2 AND c2.phone LIKE '138%' WHERE c2.status = 2 AND c2.email LIKE '%customer%' WHERE AND c2.email LIKE '%customer%' AND c2.phone LIKE '138%' WHERE AND c2.phone LIKE '138%'

索引类别

推荐索引 (表:customers)

说明

优先级

核心必备索引

(status, name)

优化主查询的status过滤和name排序,同时高效支持子查询的关联条件c2.name = c1.name

必须

高频条件索引

(status, phone)

针对status=2phone LIKE '138%'这个高选择性组合,效率极高。

建议(若条件常用)

低频条件索引

(status, email)

email LIKE '%customer%'效果有限,因模糊匹配方式无法利用索引的有序性。

谨慎(通常不推荐)

全覆盖索引

(status, name, phone, email)

作为备选,尝试用一个索引覆盖所有场景,但索引体积较大。

可选(需权衡)

索引设计思路详解

查询性能瓶颈主要在于子查询。EXISTS会为外层查询(c1)的每一行数据执行一次子查询(c2),因此子查询的速度至关重要。设计索引需遵循以下核心原则:

  1. 最左前缀原则:复合索引(A, B, C)可以被用于A=?A=? AND B=?的查询,但不能用于跳过A直接查询B=?C=?

  2. 索引选择性:指索引列区分数据的能力。phoneemail的选择性通常远高于status。选择性高的列放在复合索引中效果更好。

  3. LIKE 查询的索引利用LIKE '138%'这样的前缀匹配可以利用索引。而LIKE '%customer%'这样的前后模糊匹配基本上无法利用索引进行快速定位,通常会导致全索引扫描或全表扫描。

基于可选条件,以下是具体的索引分析和建议:

1. 必须设置的索引

  • 索引:idx_status_name (status, name)

  • 理由:

    • 这是查询的基石。无论其他条件如何组合,status=2和基于name的关联与排序都是固定的。

    • 该索引可以同时优化外层查询的WHERE c1.status = 2ORDER BY c1.name,避免昂贵的文件排序(filesort)。

    • 它也能极快地定位子查询中的c2.status = 2 AND c2.name = c1.name,这是子查询的连接条件。

2. 建议根据查询频率设置的索引

  • 索引:idx_status_phone (status, phone)

  • 理由:

    • 当查询条件包含phone LIKE '138%'时,这个索引是性能提升的关键status进行第一层快速过滤后,对phone的前缀匹配可以在这个索引上高效完成范围扫描。

    • 这个索引能完美覆盖WHERE c2.status = 2 AND c2.phone LIKE '138%'这种组合。

3. 需要谨慎考虑的索引

  • 索引:idx_status_email (status, email)

  • 理由与风险:

    • 对于email LIKE '%customer%'这个条件,由于其模糊匹配的方式,即使为(status, email)创建了索引,数据库也通常只能利用status部分进行过滤,然后对email列进行扫描。

    • 创建建议:只有当你的业务中,email字段包含'customer'的数据量非常少(例如低于1%),并且这个查询模式极其频繁时,才值得为其创建这个索引。否则,额外的索引会增加写操作的负担,但收效甚微。

4. 一个备选的综合方案

  • 索引:idx_covering (status, name, phone, email)

  • 理由与风险:

    • 这个索引试图用一个索引覆盖所有可能的查询路径。它包含了statusname以满足核心需求,同时追加了phoneemail来尝试覆盖可选条件。

    • 优点:在某些情况下,优化器可能会选择这个索引作为覆盖索引,避免回表。

    • 缺点:索引体积庞大,维护成本高。并且对于email的模糊查询,帮助依然有限。这更像是一种“重武器”,建议在充分了解数据分布后,通过EXPLAIN命令验证其效果后再决定是否采用。

实施与验证建议

  1. 使用EXPLAIN分析:创建索引后,务必使用EXPLAIN命令分析SQL语句。关注以下关键字段:

    • type:至少达到refrange级别,避免ALL(全表扫描)。

    • key:确认查询实际使用了你创建的索引。

    • Extra:如果出现Using index(覆盖索引)是最佳情况。出现Using filesort则需注意。

  2. 查询重写技巧:如果你的应用代码可以灵活调整,可以考虑将可选的查询条件动态拼接成不同的SQL,而不是依赖一个统一的复杂查询。这样可以为每种条件组合设置最合适的索引,实现最优性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1169511.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【程序员必看】voyage-context-3向量模型发布:RAG检索效率提升14%,存储成本仅0.5%,香不香?

最近看到一个有意思的工作,原文来自: voyage-context-3:聚焦分段细节,融入全局文档上下文 **概要:**Voyage AI 推出了voyage-context-3,这是一款情境化分段向量模型。它能为文本分段(chunk&…

2026年 金属零部件试制加工厂家推荐榜单:汽车/航空航天/电子电器钣金软模、热成型、激光切割及DV/EV/PV工程件专业试制 - 品牌企业推荐师(官方)

2026年金属零部件试制加工行业深度解析与权威推荐榜单 在高端制造业的快速发展浪潮中,金属零部件试制加工作为连接产品设计创意与批量生产实现的关键桥梁,其战略地位日益凸显。无论是汽车工业的快速迭代、航空航天领…

你以为的生病,其实是身体在救你

学会与身体好好说话:一份被大多数人忽略的健康使用说明书哎,咱们坐下来聊两句。最近我在复盘的时候,突然走了个神。我发现,咱们这帮在ICT行业摸爬滚打了三十年的人,特别擅长跟复杂的系统打交道。服务器报警了&#xff…

小白必看!MCP协议让AI智能体实现“模块化自由“,告别硬编码噩梦!大模型开发新范式来了!

** AI 智能体现在能做的事情真的很厉害,可以思考、规划,还能执行各种复杂任务,而且代码量并不大。这让开发者看到了一个机会:把那些庞大复杂的代码库和 API 拆解成更实用的模块。 不过要让这些智能变成现实世界里真正能用的东西…

以机器学习为基础的房价预测分析研究(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)

以机器学习为基础的房价预测分析研究(设计源文件万字报告讲解)(支持资料、图片参考_相关定制) 数据集大小为19995条 报告字数8000➕ 本项目利用机器学习算法,如随机森林回归算法,依据房型、面积、建造年份等房产数据特征预测房价。…

基于深度卷积神经网络的网络流量检测与识别(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)

基于深度卷积神经网络的网络流量检测与识别(设计源文件万字报告讲解)(支持资料、图片参考_相关定制) ,包含代码实现、数据集和项目报告。项目详情介绍可参考下图(一个是模型跑出的相关实验结果表、混淆矩阵等,一个是根…

Java面向对象必考点:封装、继承、多态深度揭秘

文章目录Java面向对象必考点:封装、继承、多态深度揭秘封装:给代码穿上“防护衣”为什么需要封装?封装的具体实现封装的好处继承:站在巨人的肩膀上继承的基本语法继承的优势继承的注意事项继承中的访问控制多态:一个接…

# 不会上下文工程,还敢说自己是大模型开发者?小白也能秒变AI大神的全攻略

最近在做Deepresearch以及刷到一个不错的文章:context-engineering-guide,这篇文章揭示了提示工程以及上下文过程在智能体应用开源流程中,包括Deepresearch,MCP在内的一些概念,起到了非常重要的作用! Conte…

广州一日游大致安排

广州一日游大致安排🌅 08:00 抵达广州东站 → 早餐(步行 5–10 分钟) 广州东站周边就是天河区核心,美食密度极高。 推荐早餐(任选其一)点都德(林和中路店) 经典广州早茶,离广州东很近 推荐:虾饺皇、凤爪、肠…

【AI技术yyds】百度搜索新范式、多智能体协作...信息检索领域最新研究成果全解析,开发者必看!从AI搜索到多模态推荐,一篇搞定所有前沿技术!

信息检索领域前沿研究观察:从AI搜索到多模态推荐 最近在信息检索领域看到了不少有意思的研究进展,从百度搜索提出的AI搜索范式到各种新颖的检索增强方法,这些工作都在试图解决当前搜索和推荐系统面临的实际问题。今天想和大家分享一下这些研究…

从排行榜看行业标杆:2026年液压拉力试验机/液压万能试验机十大品牌TOP4综合评测 - 品牌推荐大师1

液压拉力/万能试验机是现代工业与科研中用于测定金属、非金属、复合材料等力学性能的关键设备,广泛应用于航空航天、汽车制造、建筑工程、新材料研发及高等院校等众多领域。随着“中国制造2025”的深入推进与产业升级…

2026年 景观鱼池工程厂家推荐榜单:专业设计/假山鱼池/生态工程,匠心打造庭院水景艺术 - 品牌企业推荐师(官方)

2026年景观鱼池工程厂家推荐榜单:专业设计/假山鱼池/生态工程,匠心打造庭院水景艺术 在现代景观设计与庭院营造中,鱼池已从传统的水体点缀演变为融合生态、艺术与技术的综合性工程。它不仅承载着美化环境、陶冶情操…

AI Agent开发天花板:LangGraph构建DeepResearch实战,代码小白也能秒会的神操作!

上一篇内容我们讲解了怎么构建DeepResearch两个比较核心的组件:确定用户研究范围以及研究,这两个组件可以大致满足用户输入研究主题或者查询,然后输出一个研究结果,不过这个对于系统来说大概率会遇到当用户查询相对复杂&#xff0…

卫星图像匹配 - MKT

卫星图像匹配 1 ISPRS2024 | 视觉语言模型 | 基于Transformer和视觉基础模型的跨视角遥感图像检索方法 A Transformer and Visual Foundation Model-Based Method for Cross-View Remote Sensing Image RetrievalarXi…

【AI新突破】DeepResearch开源:让AI自己搞研究,程序员解放了!附保姆级代码解析+实战教程[特殊字符]

引言 在人工智能快速发展的今天,如何构建一个能够进行深度研究、自主学习和迭代优化的AI系统成为了技术前沿的重要课题。Gemini开源的DeepResearch一周收获7.9k Star,Google的开源项目Gemini DeepResearch技术通过结合LangGraph框架和Gemini大语言模型&…

硬核干货 | 从原型到生产:Anthropic多智能体系统构建全攻略,性能提升90%的秘密都在这里!

Anthropic 公司在 2025 年 6 月 13 日发表了一篇名为《如何构建多智能体研究系统》的文章。 Anthropic 的研究功能利用多个 Claude 智能体(Agent)更高效地探索复杂主题。本文将分享在构建这个系统过程中遇到的工程挑战以及所学到的经验。 Claude 现已具…

RAG开发必看:结构化数据的5种骚操作,小白程序员也能轻松掌握

大家好!今天来聊聊如何在RAG应用中更好地利用结构化数据。很多同学可能觉得RAG主要是处理文本文档,但其实结构化数据也能发挥很大作用。我总结了5种实用的方法: 1. 直接存储行数据 最简单直接的方式就是把数据表的每一行当作一个独立的chun…

2026年 无痕内衣品牌实力推荐榜:无缝文胸与女士内衣舒适科技深度解析,甄选优质女性内衣厂家 - 品牌企业推荐师(官方)

2026年无痕内衣品牌实力推荐榜:无缝文胸与女士内衣舒适科技深度解析,甄选优质女性内衣厂家 随着女性自我意识的觉醒与消费理念的升级,内衣市场正经历一场深刻的“舒适革命”。传统钢圈、蕾丝、缝线带来的束缚与不适…

Adam自适应学习率稳医疗模型AUC

📝 博客主页:jaxzheng的CSDN主页 Adam自适应学习率:医疗AI模型AUC稳定性的关键突破目录Adam自适应学习率:医疗AI模型AUC稳定性的关键突破 引言:医疗AI性能的隐性危机 一、技术本质:Adam为何能“稳住”AUC&a…

API已死,模型永生?揭秘AI创业公司从“包装“到“自研“的逆袭之路,小白也能上车!

现在,大部分AI创业公司都是调用大厂的API来做产品。这样做目前没问题,但是按照历史规律,每家有野心的AI公司最后都会训练自己的模型——哪怕一开始只是做个简单封装的公司也不例外。为什么?因为训练模型的门槛正在快速下降。模型蒸…