如何优化慢SQL?索引失效的常见场景有哪些?

以下是一些优化慢SQL的方法以及索引失效的常见场景:

优化慢SQL的方法

  • 索引优化
    • 分析查询语句:通过数据库的查询分析工具,如MySQL的EXPLAIN命令,查看查询执行计划,了解数据库如何使用索引来执行查询,确定是否存在索引未被使用或使用不当的情况。
    • 添加必要索引:根据查询语句中经常用于过滤、连接和排序的列,添加合适的索引。但要注意索引并不是越多越好,过多的索引会增加数据插入、更新和删除的开销。
    • 覆盖索引:尽量使用覆盖索引,即查询所需的所有列都包含在索引中,这样数据库可以直接从索引中获取数据,而无需回表查询,提高查询效率。
    • 操作示例:
      -- 1) 看执行计划EXPLAINSELECTuser_id,status,created_atFROMordersWHEREuser_id=123ANDstatus=1ORDERBYcreated_atDESCLIMIT20;-- 2) 按过滤 + 排序列建立联合索引CREATEINDEXidx_orders_user_status_createdONorders(user_id,status,created_at);-- 3) 覆盖索引:只查索引里的列,减少回表EXPLAINSELECTuser_id,status,created_atFROMordersWHEREuser_id=123ANDstatus=1ORDERBYcreated_atDESCLIMIT20;
  • 查询语句优化
    • 简化查询逻辑:避免复杂的子查询、嵌套查询和不必要的连接操作。可以尝试将复杂查询分解为多个简单的查询,以提高查询性能。
    • 合理使用连接条件:在使用连接操作时,确保连接条件使用了正确的列和合适的数据类型,并在连接列上建立了索引。
    • 避免全表扫描:尽量使用有选择性的条件来过滤数据,避免使用导致全表扫描的查询条件,如在查询条件中使用了函数或表达式,可能会使索引失效。
    • 操作示例:
      -- 1) 子查询改 JOIN(示例)EXPLAINSELECTu.id,u.nameFROMusers uJOINorders oONo.user_id=u.idWHEREo.status=1;-- 2) 避免在索引列上做函数计算:用范围条件替代EXPLAINSELECT*FROMusersWHEREcreated_at>='2024-01-01'ANDcreated_at<'2025-01-01';
  • 数据库配置优化
    • 调整缓存参数:根据服务器的硬件资源和数据库的使用情况,合理调整数据库的缓存参数,如InnoDB缓冲池大小等,以提高数据的缓存命中率,减少磁盘I/O。
    • 优化数据库引擎参数:针对不同的数据库引擎,调整相关的性能参数,如MySQL的查询缓存、线程池大小等,以适应具体的业务需求和硬件环境。
    • 操作示例:
      -- 查看 InnoDB 缓冲池大小(单位:bytes)SHOWVARIABLESLIKE'innodb_buffer_pool_size';-- 开启慢查询日志并设置阈值(示例:生产环境请评估影响)SETGLOBALslow_query_log='ON';SETGLOBALlong_query_time=0.5;
  • 数据结构优化
    • 范式化与反范式化:根据业务需求和查询特点,合理设计数据库的表结构。在某些情况下,适当的反范式化可以减少连接操作,提高查询性能,但要注意数据冗余和一致性问题。
    • 分区分表:对于数据量较大的表,可以考虑进行分区分表操作,将数据分散存储在不同的物理文件或服务器上,以提高查询和数据管理的效率。
    • 操作示例:
      -- 按时间范围分区(示例:按月)CREATETABLEorders_p(idBIGINTPRIMARYKEY,created_atDATETIMENOTNULL,user_idBIGINTNOTNULL,amountDECIMAL(10,2)NOTNULL,KEYidx_user_created(user_id,created_at))PARTITIONBYRANGE(TO_DAYS(created_at))(PARTITIONp202501VALUESLESS THAN(TO_DAYS('2025-02-01')),PARTITIONpmaxVALUESLESS THAN MAXVALUE);

索引失效的常见场景

  • 数据类型不匹配
    • 列类型与查询值类型不一致:如果列定义为字符串类型,而在查询中使用数字作为条件,可能导致索引失效。例如在MySQL中,将一个VARCHAR类型的列与一个INT类型的值进行比较。
    • 操作示例:
      -- phone 是 VARCHAR 且有索引EXPLAINSELECT*FROMusersWHEREphone=13800138000;EXPLAINSELECT*FROMusersWHEREphone='13800138000';
  • 使用函数或表达式
    • 在索引列上使用函数:在查询条件的索引列上使用函数,会使索引失效。例如在MySQL中,SELECT * FROM users WHERE YEAR(created_at) = 2024;,这里对created_at列使用了YEAR函数。
    • 表达式计算:如果查询条件中对索引列进行了表达式计算,索引可能无法使用。如SELECT * FROM orders WHERE order_amount * 2 > 1000;,对order_amount列进行了乘法运算。
    • 操作示例:
      -- created_at 有索引EXPLAINSELECT*FROMusersWHEREYEAR(created_at)=2024;EXPLAINSELECT*FROMusersWHEREcreated_at>='2024-01-01'ANDcreated_at<'2025-01-01';-- order_amount 有索引EXPLAINSELECT*FROMordersWHEREorder_amount*2>1000;EXPLAINSELECT*FROMordersWHEREorder_amount>500;
  • 查询条件使用不当
    • 使用不等于操作:使用不等于(<>!=)操作符时,索引可能无法有效利用。因为数据库需要扫描大量的数据来确定不满足条件的记录。
    • 使用OR连接条件:当OR连接的多个条件中只有部分列有索引时,可能导致索引失效。例如SELECT * FROM products WHERE product_id = 100 OR product_name = 'Apple';,如果product_name列没有索引。
    • 范围查询后的列:在一个查询中,如果有多个条件,范围查询之后的列上的索引可能失效。如SELECT * FROM users WHERE age > 30 AND name = 'John';,如果name列在age列之后进行范围查询,name列的索引可能不被使用。
    • 操作示例:
      -- 不等于通常选择性较差EXPLAINSELECT*FROMtWHEREstatus!=1;-- OR:两边都要可用索引,否则容易回退EXPLAINSELECT*FROMproductsWHEREproduct_id=100ORproduct_name='Apple';-- 联合索引 (age, name):范围条件会影响后续列利用EXPLAINSELECT*FROMusersWHEREage>30ANDname='John';EXPLAINSELECT*FROMusersWHEREage=31ANDname='John';
  • 数据分布不均匀
    • 列数据倾斜:如果索引列中的数据分布非常不均匀,大量数据集中在少数几个值上,数据库可能会选择不使用索引,而采用全表扫描。
    • 操作示例:
      -- is_deleted 只有 0/1,选择性差;通常用组合索引提升过滤效果EXPLAINSELECT*FROMordersWHEREis_deleted=0ANDuser_id=123;
  • 其他情况
    • 表结构变更:在对表进行结构变更操作后,如添加或删除列、修改列的数据类型等,可能会导致索引失效或性能下降,需要及时重建或优化索引。
    • 存储引擎限制:不同的存储引擎对索引的支持和使用方式可能有所不同。某些存储引擎可能在特定情况下无法有效地使用索引,如MyISAM存储引擎在处理全文搜索时,与InnoDB存储引擎的索引使用方式和性能就有所差异。
    • 操作示例:
      ALTERTABLEusersMODIFYCOLUMNphoneVARCHAR(32)NOTNULL;ANALYZETABLEusers;OPTIMIZETABLEusers;

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

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

相关文章

springboot+vue开发实现新能源汽车4s店销售管理系统应用和研究

文章目录摘要项目简介大数据系统开发流程主要运用技术介绍爬虫核心代码展示结论源码文档获取定制开发/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;摘要 随着新能源汽车市场的快速发展&#xff0c;传统4S店销售管理模式面临信息化、智能化转型需求…

技术视角拆解:一家AI搜索优化服务商的完整方法论——以北京链创网络为例

摘要&#xff1a; 本文从技术实现与方案设计的角度&#xff0c;深入剖析一家AI搜索优化&#xff08;GEO&#xff09;服务商——北京链创网络科技有限公司公开的解决方案。通过解构其“GEO驱动的AI种草营销”全链路图&#xff0c;分析其中各环节的技术内涵与逻辑关联&#xff0c…

Hadoop数据可视化解决方案

Hadoop数据可视化实战&#xff1a;从海量数据到直观 Insights 的完整解决方案 副标题&#xff1a;整合工具链、优化性能、避坑指南 摘要/引言 问题陈述 Hadoop作为大数据生态的核心存储与计算平台&#xff0c;承载了企业80%以上的海量数据&#xff08;如用户行为日志、交易…

降ai率工具红黑榜:拒绝智商税,这几款免费降ai率工具才真好用

最近太多人私信我&#xff1a;“论文AI率太高怎么办&#xff1f;连人工改的都不过检测&#xff01;” 这事儿我太懂了——前段时间我自己也被AI检测折磨得快崩溃。 市面上一堆打着“降低AI率”旗号的网站&#xff0c;不是乱扣格式&#xff0c;就是改完反而更像AI写的。 所以我…

电脑c盘红了怎么清理c盘空间,教你几招解决,马上满血复活!

很多不是很懂电脑的用户&#xff0c;在用电脑的时候不会去选择文件存放路径&#xff0c;所以几乎所有的文件全部的默认存放在C盘中了。时间久了&#xff0c;C Drive 就会变红并且提示空间不足&#xff0c;电脑不仅会越来越卡了&#xff0c;甚至有的程序还会无法运行。那么今天&…

免费降低ai率看这篇就够了!5款降ai率工具实测,降ai效果炸裂。

最近太多人私信我&#xff1a;“论文AI率太高怎么办&#xff1f;连人工改的都不过检测&#xff01;” 这事儿我太懂了——前段时间我自己也被AI检测折磨得快崩溃。 市面上一堆打着“降低AI率”旗号的网站&#xff0c;不是乱扣格式&#xff0c;就是改完反而更像AI写的。 所以我…

GitHub精选----从监控到黑苹果:盘点5个让你相见恨晚的硬核开源项目

摘要&#xff1a;作为技术折腾党&#xff0c;我们的收藏夹里永远缺一个“更顺手”的工具。今天为大家挖掘了 GitHub 上 5 个各具特色的开源项目&#xff1a;有的能让你一眼看穿 VPS 的真实状态&#xff0c;有的能利用 AI 自动解密&#xff0c;还有的能让你的 Proxmox 服务器秒变…

【免费】AD人员信息自动同步工具|人事变动实时响应,企业账号管理高效协同

》》》客户背景国内大型多元化集团&#xff0c;员工超5000人、全国40余个分支机构&#xff0c;业务覆盖制造、零售、服务等领域。员工入职、离职、调岗等人事变动频繁&#xff0c;需同步AD账号、Exchange邮箱、企业微信、OA等多平台账号信息&#xff0c;传统人工管理已难适配高…

AI助力巴菲特式护城河分析:多维度评估竞争优势

AI助力巴菲特式护城河分析&#xff1a;多维度评估竞争优势关键词&#xff1a;AI、巴菲特式护城河、竞争优势评估、多维度分析、数据分析摘要&#xff1a;本文探讨了如何利用AI技术助力进行巴菲特式的护城河分析&#xff0c;实现对企业竞争优势的多维度评估。首先介绍了研究的背…

2026最新实测:降ai率从50%降到10%!ai降ai实操流程分享,论文降ai并不难。

最近太多人私信我&#xff1a;“论文AI率太高怎么办&#xff1f;连人工改的都不过检测&#xff01;” 这事儿我太懂了——前段时间我自己也被AI检测折磨得快崩溃。 市面上一堆打着“降低AI率”旗号的网站&#xff0c;不是乱扣格式&#xff0c;就是改完反而更像AI写的。 所以我…

1951-2024年各区县平均风速数据

平均风速是描述一个地区风力强弱的重要气象指标&#xff0c;是指空间某一点&#xff0c;在给定的时段内各次观测的风速之和除以观测次数&#xff0c;其广泛应用于气候研究、农业、风能开发等领域 本分享数据包含中国各区县的平均风速数据&#xff0c;涵盖了1951年至2024年之间…

缠三买点涨停基因 条件预警公式

{}N1:5;{最近下跌天数} N2:31;{上涨天数} N3:55;{评台高点天数} LL:LLV(L,N1); HH:REF(HHV(H,N2),N1); H0:REF(HHV(H,N3),N1N2); 缠三买点:HHHHV(H,N2N1) AND LL>H0; 涨停基因:(C-REF(C,1))/REF(C,1)*100; 涨停120:INTPART(SUM(涨停基因>9.9,120)); 涨停60:INTPART(SUM(涨…

通达信清新的“精准极品底”公式

{}{精准极品底} VAR17:REF((LOWOPENCLOSEHIGH)/4,1); VAR27:SMA(ABS(LOW-VAR17),13,1)/SMA(MAX(LOW-VAR17,0),10,1); VAR37:EMA(VAR27,10); VAR47:LLV(LOW,33); 走势线: 3*SMA((CLOSE-LLV(LOW,27))/(HHV(HIGH,27)-LLV(LOW,27))*100,5,1)-2*SMA(SMA((CLOSE-LLV(LOW,27))/(HHV(HI…

麻雀搜索算法优化深度置信网络:SSA-DBN模型解析与代码注释详解,简单上手,轻松掌握

麻雀搜索算法优化深度置信网络&#xff1a;SSA-DBN&#xff0c;代码注释详细&#xff0c;上手简单。 江湖传言深度置信网络&#xff08;DBN&#xff09;遇上了麻雀搜索算法&#xff08;SSA&#xff09;&#xff0c;炼丹效率直接翻倍。今天就带大家手搓一套SSA-DBN组合拳&#…

miniwiggler连接不上可能出问题得地方

Miniwiggler 连不上&#xff0c;99% 是“物理层 → 驱动 → 配置”三步里某一环断了。 按“先硬后软”顺序&#xff0c;一张表带你一次排完&#xff1a;排查项典型症状快速验证指令/动作解决要点1. 目标板供电LED 全灭 / 3.3V 测试点无电压万用表量 Vext3.3V、Vref1.2V先给板子…

超级宝贝的不带未来函数的主图指标

{}SR1:REF(HIGH,10)HHV(HIGH,2*101); SR2:FILTER(SR1,10); SR3:BACKSET(SR2,101); HD:FILTER(SR3,10); 前高:REF(H,BARSLAST(HD)); DRAWICON(CROSS(C,前高),L-0.20,3);{突破前高的信号}; N:75;P:5;P1:10; {N为多少天内的高低值参数&#xff0c;我以自已的初始K线根数定义。P1、…

基于Hadoop的黑龙江旅游景点推荐系统的设计与实现(源码+论文+部署+安装)

感兴趣的可以先收藏起来&#xff0c;还有在毕设选题&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;我会一一回复&#xff0c;希望可以帮到大家。一、程序背景在旅游产业数字化转型加速与游客需求多元化的双重背景下&#xff0c;黑龙江旅游行业传统服务…

黑盒测试的底层逻辑

什么是黑盒测试&#xff1f; 它是把程序看作一个黑盒子&#xff0c;在不考虑程序内部结构的情况下&#xff0c;检查程序功能是否按照PRD的规定正常使用&#xff0c;程序是否能适当地接收输入数据&#xff0c;产生正确的输出。 这其实就是黑盒测试的定义&#xff0c;也是黑盒测…

【无线传感器】基于matlab遗传算法GA无线传感器网络中聚类以增强网络寿命【含Matlab源码 14848期】

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到海神之光博客之家&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49…

解析 ‘Progressive Revelation’:如何在图执行过程中,分阶段向用户展示 Agent 的思考进度?

尊敬的各位同仁、技术爱好者们&#xff1a; 大家好&#xff01; 今天&#xff0c;我们聚焦一个在构建智能体&#xff08;Agent&#xff09;系统时至关重要&#xff0c;却又常被忽视的议题——渐进式揭示&#xff08;Progressive Revelation&#xff09;。特别是在复杂的图执行…