当前位置: 首页 > news >正文

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.jsqmd.com/news/254225/

相关文章:

  • 【程序员必看】voyage-context-3向量模型发布:RAG检索效率提升14%,存储成本仅0.5%,香不香?
  • 2026年 金属零部件试制加工厂家推荐榜单:汽车/航空航天/电子电器钣金软模、热成型、激光切割及DV/EV/PV工程件专业试制 - 品牌企业推荐师(官方)
  • 你以为的生病,其实是身体在救你
  • 【AI技术yyds】百度搜索新范式、多智能体协作...信息检索领域最新研究成果全解析,开发者必看!从AI搜索到多模态推荐,一篇搞定所有前沿技术!
  • 小白必看!MCP协议让AI智能体实现“模块化自由“,告别硬编码噩梦!大模型开发新范式来了!
  • 以机器学习为基础的房价预测分析研究(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)
  • 基于深度卷积神经网络的网络流量检测与识别(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)
  • Java面向对象必考点:封装、继承、多态深度揭秘
  • # 不会上下文工程,还敢说自己是大模型开发者?小白也能秒变AI大神的全攻略
  • RAG开发必看:结构化数据的5种骚操作,小白程序员也能轻松掌握
  • 广州一日游大致安排
  • 2026年 景观鱼池工程厂家推荐榜单:专业设计/假山鱼池/生态工程,匠心打造庭院水景艺术 - 品牌企业推荐师(官方)
  • 从排行榜看行业标杆:2026年液压拉力试验机/液压万能试验机十大品牌TOP4综合评测 - 品牌推荐大师1
  • 卫星图像匹配 - MKT
  • AI Agent开发天花板:LangGraph构建DeepResearch实战,代码小白也能秒会的神操作!
  • 【AI新突破】DeepResearch开源:让AI自己搞研究,程序员解放了!附保姆级代码解析+实战教程[特殊字符]
  • 硬核干货 | 从原型到生产:Anthropic多智能体系统构建全攻略,性能提升90%的秘密都在这里!
  • 2026年 无痕内衣品牌实力推荐榜:无缝文胸与女士内衣舒适科技深度解析,甄选优质女性内衣厂家 - 品牌企业推荐师(官方)
  • Adam自适应学习率稳医疗模型AUC
  • API已死,模型永生?揭秘AI创业公司从“包装“到“自研“的逆袭之路,小白也能上车!
  • 直播录制教程如何录制高清直播回放与剪辑推荐录制软件与工具
  • 新电脑一些常用设置
  • 【爆肝整理】程序员必看!2025年大模型/AI技术50篇必读论文,不看后悔一年![特殊字符]
  • 2026年GEO源代码源头哪家靠谱?品质之选汇总 - 源码云科技
  • CentOS 7.9 完美部署指南:Go语言环境搭建与Oracle/MySQL数据库连接全攻略
  • 2026年优质GEO系统源码源头盘点,稳定可靠之选 - 源码云科技
  • 2026年 高低温实验箱厂家推荐榜单:恒温恒湿/交变实验箱品牌深度解析,精准控温与耐久品质之选 - 品牌企业推荐师(官方)
  • 无人机数据集 - MKT
  • 实战:高级中文自然语言处理系统的Python设计与实现 - 指南
  • 2026年 绿植租摆服务商推荐榜单:绿植租赁,办公室绿植,绿植租摆公司精选,打造生态办公空间新风尚 - 品牌企业推荐师(官方)