MySQL,针对limit优化,以及讨论using filesort、using temporary和索引失效的问题

MySQL慢查询优化实战:从EXPLAIN读懂执行计划与索引设计 在大数据量业务场景下,SQL慢查询是后端开发最常见的性能瓶颈之一。理解数据库执行计划是优化查询的基础,而MySQL的EXPLAIN工具则是剖析执行计划的核心手段。通过解读type、rows、Extra等关键字段,可以快速识别全表扫描、索引失效、临时表排序等隐患。在实际工程中,结合慢查询日志定位高频问题,再基于EXPLAIN输出设计合理的联合索引,能显著提升SQL执行效率。本文从执行计划的基本概念出发,拆解各字段含义,并通过真实案例演示从慢查询发现到索引落地的完整优化链路,帮助开发人员建立系统的性能调优思维。 阅读详情

针对limit优化,以及讨论using filesort、using temporary和索引失效的问题

表结构

CREATE TABLE `a` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `code` CHAR(36) DEFAULT NULL,
  `name` CHAR(20) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `code` (`code`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;

CREATE TABLE `b` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `code` CHAR(36) DEFAULT NULL,
  `col1` CHAR(22) DEFAULT NULL,
  `col2` CHAR(22) DEFAULT NULL,
  `col3` CHAR(22) DEFAULT NULL,
  `col4` CHAR(22) DEFAULT NULL,
  `col5` CHAR(22) DEFAULT NULL,
  `col6` CHAR(22) DEFAULT NULL,
  `col7` CHAR(22) DEFAULT NULL,
  `col8` CHAR(22) DEFAULT NULL,
  `col9` CHAR(22) DEFAULT NULL,
  `col10` CHAR(22) DEFAULT NULL,
  `col11` CHAR(22) DEFAULT NULL,
  `col12` CHAR(22) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `code` (`code`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;

-- 插入测试数据

INSERT INTO a (NAME) VALUES('n');
INSERT INTO a (NAME) SELECT NAME FROM a; -- 执行多次,达到一定数据量
UPDATE a SET CODE = UUID();
UPDATE a SET NAME = id;
INSERT INTO b (CODE) SELECT CODE FROM a; -- 以a表code作为b表code
-- 设置b表的其它字段值
UPDATE b SET 
col1=CONCAT('c',id),col2=CONCAT('c',id),col3=CONCAT('c',id)
,col4=CONCAT('c',id),col5=CONCAT('c',id),col6=CONCAT('c',id)
,col7=CONCAT('c',id),col8=CONCAT('c',id),col9=CONCAT('c',id)
,col10=CONCAT('c',id),col11=CONCAT('c',id),col12=CONCAT('c',id);
-- 再对b表翻倍2次,即4倍,执行2次
INSERT INTO b (CODE,col1,col2,col3,col4,col5,col6,col7,col8,col9,col10,col11,`col12`)
SELECT CODE,col1,col2,col3,col4,col5,col6,col7,col8,col9,col10,col11,`col12` FROM b;

-- a表有131072行,b表有524288行
-- 查询总结果集

SELECT COUNT(1)
FROM a 
INNER JOIN b ON a.code=b.code;


-- count: 524288

-- 未优化前
 

EXPLAIN
SELECT a.id AS aid,a.name
,b.id AS bid,b.code,b.col1
,b.col2,b.col3,b.col4,b.col5
,b.col6,b.col7,b.col8,b.col9
,b.col10,b.col11
FROM a 
INNER JOIN b ON a.code=b.code
ORDER BY b.id
LIMIT 520000,20;

执行计划是这样的: 

-- 耗时:14.2s

-- 优化1.先用临时表查询一部分字段,在inner join 查询全部需要的字段
 

EXPLAIN
SELECT t.aid,t.name
,b.id AS bid,b.code,b.col1
,b.col2,b.col3,b.col4,b.col5
,b.col6,b.col7,b.col8,b.col9
,b.col10,b.col11
FROM (
 SELECT a.id AS aid,b.id,a.name
 FROM a INNER JOIN b ON a.code=b.code
 ORDER BY b.id 
 LIMIT 520000,20
 ) t INNER JOIN b ON t.id=b.id;

执行计划是这样的:  

 解释一下执行计划id这一列:id的数值说明了多表连接的连接顺序,原则是:从大到小,从上到下,

 所以,连接顺序第3行,第4行,第1行,第2行

-- 耗时:4s 说明起作用了,此方法优化的效率取决于临时表t的字段数量

-- 2.反向查询法,当偏移量大于where筛选后总量的【一半】时,可以使用反向查找(原理下面讲)
-- ,排序规则相反,缩小偏移量offsize,
-- 新偏移量=where筛选后总数-旧偏移量-size,所以,offsize=524288 - 520000 - 20 = 4268
-- 不过这样查出来的数据顺序与我们需要的结果是相反的,所以需要再倒转结果集,或者渲染时反向遍历

EXPLAIN
SELECT t.aid,t.name
,b.id AS bid,b.code,b.col1
,b.col2,b.col3,b.col4,b.col5
,b.col6,b.col7,b.col8,b.col9
,b.col10,b.col11
FROM (
 SELECT a.id AS aid,b.id,a.name
 FROM a INNER JOIN b ON a.code=b.code
 ORDER BY b.id DESC
 LIMIT 4268,20
 ) t INNER JOIN b ON t.id=b.id ORDER BY t.id ASC; 
-- 最后这个order要注意一下,不要by b.id,否则会出现Using temporary; Using filesort
-- by t.id只会有Using filesort,下面的sql同理,后面会解释原理的。

执行计划是这样的:  

-- 耗时:3.8s 这个变化很微弱?或者说根本没用?我觉的可能被其它因素影响了,这个我们先放着,下面再验证

-- 优化到这一步,很明显3.8秒不符合正常的要求.
-- 经过分段执行发现,效率出现大损耗的地方是,第10行:【ORDER BY b.id DESC】
-- ,这时我就有疑惑了,虽然这里需要排序的数据量非常大,但b.id不是索引字段吗?
-- 此处应该用到索引排序的!可以通过这个执行计划第3行的Extra发现并没有,而是用到了额外的排序(using filesort),为什么?

-- 网上博客: "要尽可能的保证排序字段在驱动表中"
-- 先解释什么是驱动表:这一切还得从MySQL多表连接的处理方式说起,首先MySQL优化器要确定以谁为驱动表,
-- 也就是说以哪个表为基准,在处理此类问题时,MySQL优化器采用了简单粗暴的解决方法:哪个表的结果集小,
-- 就以哪个表为驱动表,当然MySQL优化器实际的处理方式会复杂许多,还会根据order by 的字段来优化
-- 也就是说如果你的order by 子句排序字段在大表的话,优化器‘或许’会选择大表为驱动表,当然前提是
-- 你的另一张表的关联字段建立了索引,否则还是会选择关联字段有索引的表为‘被’驱动的对象,比如:
-- if a表 < b表,a表的code字段没有索引,而b表的字段code有索引,则选择a为驱动,b为被驱动,a主b从
-- if a < b, a.code有索引,b.code无索引,则b主a从
-- if a < b, a.code和b.code都有索引,先不考虑order by的排序字段,则a主b从
-- if a < b, a.code和b.code都有索引,如有order by b.id,则不确定,如果a 小于 b很多的话
--     还是会选择a为驱动,a主b从,如果差别不明显的话,b主a从,
-- 正因为优化器选择驱动表的复杂性,所以有时人是很难判断出哪个是驱动表,刚开始验证这个时,
-- a的数据量是b的1/2,本来‘反向查询法’那一块sql,执行的时候还是以a表为驱动,还是很耗时的,
-- 但过了一会儿以后,数据我并没有改变,再执行发现很快,瞬间懵逼了,通过explain 查看驱动表变成了b表
-- 我把b表翻倍以后,才让驱动表稳定为a表。
-- 这让我不得不怀疑MySQL有JIT的优化,至于事实有没有我没有找到资料文档。


-- 驱动表的解释就到这里了,下面接着理解“要尽可能的保证排序字段在驱动表中”这句话。
-- a = 1/4b,
-- 上面这个sql语句并没有where筛选过滤,所以a表结果集 < b表结果集,则a表是驱动
-- 显而易见,排序字段b.id是b表的字段,不在驱动表内
-- ,于是乎不可避免的出现了"额外的排序"[Using filesort],甚至使用了"临时表"[Using temporary]
-- 更准确的说,
-- 1.用非驱动表的字段排序会出现[Using temporary]
--   则不管排序的字段有没有索引都会[Using filesort],
-- 3.而用驱动表字段排序则不会[Using temporary],
--   则要想都没有[Using temporary]和[Using filesort]必须是驱动表的索引字段
-- 即两个条件:1:驱动;2:索引

-- 既然这样,那我们对语句修改,修改后的语句是:

EXPLAIN
 SELECT t.aid,t.name
,b.id AS bid,b.code,b.col1
,b.col2,b.col3,b.col4,b.col5
,b.col6,b.col7,b.col8,b.col9
,b.col10,b.col11
FROM (
 SELECT a.id AS aid,b.id,a.name
 FROM a INNER JOIN b ON a.code=b.code
 ORDER BY a.id DESC
 LIMIT 4268,20
 ) t INNER JOIN b ON t.id=b.id ORDER BY t.aid ASC;

 执行计划是这样的: 

发现执行计划第3行Extra没有了 Using temporary; Using filesort,并且type变成了index

-- 耗时:0.02s
-- 现在我们继续验证反向查找法是否有用,在此语句基础去掉反向查找法的优化看看效率怎样

EXPLAIN
 SELECT t.aid,t.name
,b.id AS bid,b.code,b.col1
,b.col2,b.col3,b.col4,b.col5
,b.col6,b.col7,b.col8,b.col9
,b.col10,b.col11
FROM (
 SELECT a.id AS aid,b.id,a.name
 FROM a INNER JOIN b ON a.code=b.code
 ORDER BY a.id 
 LIMIT 520000,20
 ) t INNER JOIN b ON t.id=b.id;


-- 1.7s,1.7s > 0.02s 证明了反向查找法有效
-- 反向查找法有效的原理:首先limit 的本质是扫描offsize + size 次,舍弃前offsize行数据,只去后size行
-- 比如 limit 520000,20 ,则扫描520000+20行,舍弃前520000行,取后20行

-- 所以得出结论:偏移量offsize越小扫描的的次数越少,效率更高,通过比较explain的rows的信息可以看到扫描次数区别

-- 经过把排序字段改为驱动表的字段后(b.id ->  a.id),效果立竿见影,只需0.02s和1.7s-- 这个提升级别是很大的
-- 但是有个问题,排序的字段变了,结果当然就不一样了
-- ,这个问题只能具体情况具体分析了,到底用不用驱动表的字段来排序要根据具体业务逻辑来
-- 如果一定要保证排序字段在驱动表中,需要用STRAIGHT_JOIN 代替 inner join 来强制连接顺序

EXPLAIN
 SELECT t.aid,t.name
,b.id AS bid,b.code,b.col1
,b.col2,b.col3,b.col4,b.col5
,b.col6,b.col7,b.col8,b.col9
,b.col10,b.col11
FROM (
 SELECT a.id AS aid,b.id,a.name
 FROM b STRAIGHT_JOIN a ON a.code=b.code
 ORDER BY b.id DESC
 LIMIT 4268,20
 ) t INNER JOIN b ON t.id=b.id ORDER BY t.id ASC;

执行计划是这样的:  

-- 耗时:0.06s, 效率又差了点,这是意料之中的,大表驱动小表效率不差才怪,如果这里b表更大的话,效率会更差
-- 这要注意,改变驱动表,比如,b驱动a,如果a.code原来没有索引
-- ,则必须要另外为a.code建立索引,否则
-- ,数据量一大,等待执行结果就得looong time了
-- 总结:优化要根据实际情况来,没有绝对的好的语句,也没有永远美的语句
-- 不同时期的语句优化也不一样
-- 大家可能会遇到类似下面的问题:原本运行良好的查询语句,过了一段时间后,可能会突然变得很糟糕。
-- 一个很大可能的原因就是数据分布情况发生了变化,比如:b表变得比a表大
-- ,或者联合查询的where字句的条件筛选出现新变化,从而导致MySQL优化器对驱动表的选择发生了变化
-- ,进而出现on字句使用索引失效的情况,除非强制驱动表STRAIGHT_JOIN。
 

有笔记本功能但自动记录的桌面程序五金激光打标机、塑胶激光打码机,玻璃紫外激光喷码机、塑胶按键激光镭雕机、灯具激光打码机、金属激光打标机,氧化铝激光打黑、光纤激光焊接机、手持式激光焊接机、全自动连续激光焊接机、光纤激光切割机、金属激光切割机、非金属激光切割机icon-default.png?t=N7T8https://pan.baidu.com/s/1s9d69-wNJPh5tEOMAZsJvg?pwd=yjg4

MySQL数据库从入门到调优实战:环境搭建、SQL执行与性能优化全链路指南 这类教程最值得先看的不是它承诺几天能学会,而是它能不能帮你把数据库从“安装、建表、写查询”到“看懂执行计划、动手调优”这个完整链路跑通。很多新手卡住的点不是语法背不下来,而是不知道每一步操作背后的资源消耗、执行顺序和结果该怎么验证。如果你是完全零基础,或者之前学过但一直没动手做过持续优化,那这篇文章会按实际项目推进的顺序,带你走一遍从环境搭建到实战调优的关键环节。 我建议你先别急着背 SQL 语句大全,而是按这个顺序来:第一,确保你的本地环境能稳定运行 MySQL 服务;第二,能用客户端连上并执行最基本的增 阅读详情

相关推荐

【网络安全】Centos7安装杀毒软件----ClamAV

Clam AntiVirus是一个Linux系统上使用的反病毒软件包。主要应用于邮件服务器,采用多线程后台操作,可以自动升级病毒库。

你在看屏幕的同时,屏幕也在注视着你 8828

Using temporary与Using filesort

通过explain查看sql的执行计划时,Extra字段的值往往会看到Using where; Using index; Using temporary; Using filesort,其中此次重点关注Using temporary; Using filesort。 Using temporary Using temporary表示由于排序没有走索引、使用union、子查询连接查询、使用某些视图等...

祈雨v的博客 5万+

5种隐藏代码到图片的实用技巧:从Notepad++到Linux命令全解析

本文详细解析了5种将代码或文本隐藏到图片中的实用数据隐写技巧。从Notepad++尾部追加、Windows命令行合并,到编辑图像元数据、使用十六进制编辑器,再到Linux的cat/dd命令,全面覆盖了从图形界面到命令行的工程化实践方法,帮助开发者和安全研究人员掌握隐蔽信息传输与存储的核心技术。

hh234的博客 353

四、MySql中explain的时候出现Using where; Using index; Using temporary; Using filesort

通过explain查看sql的执行计划时,Extra字段的值往往会看到Using where; Using index; Using temporary; Using filesort 一、using filesort 在使用order by关键字的时候,如果待排序的内容不能由所使用的索引直接完成排序的话,那么mysql有可能就要进行文件排序。 【这个 filesort 并不是说通过磁盘文件进行排序,而只是告诉我们进行了一个排序操作而已】。 此时,可以进行的优化: ...

IT蜗牛的专栏 2万+

CKA考试实战指南--从备考到通关的完整攻略

本文提供了一份全面的CKA考试实战指南,涵盖从备考规划、资源选择到高效练习环境搭建的全过程。重点解析了考试核心内容,特别是占分30%的故障排除难点,并分享了集群升级、etcd备份等高频考点的突破技巧与临场实战策略,帮助考生系统掌握Kubernetes实操技能,顺利通过认证。

weixin_28839549的博客 490

项目管理知识体系(PMBOK)中的质量规划详解

你是否遇到过这些场景?软件上线后用户投诉“功能漏洞多”,团队连夜返工;装修完的房子墙面开裂,施工方和业主互相推诿;新研发的手机电池续航不达标,被迫延迟发布。这些问题的根源,往往是项目启动时没有做好质量规划。本文聚焦PMBOK中“质量规划”(Plan Quality Management)过程,覆盖其核心概念、操作步骤、工具技术与实战应用,适用于IT、建筑、制造等各类项目场景。

项目管理的博客 1118

MySQL中using filesort 与 using temporary

使用了文件排序,一般情况下是因为order by 排序索引失效或者没使用索引,在order by 排序之前需要对数据进行过滤,否则索引不会生效,“无过滤不索引”,原因可以查看我之前博客 MySQL开发优化细节 一文。使用了临时表保存结果,一般情况下是因为连表操作时 group by 中索引失效,优化技巧就是需要关注我们的sql执行顺序。以及我们的小表驱动大表,表驱动的 nested loop 原理。

m0_49151953的博客 1757

simulink的Sine Wave 模块详解

模块是 Simulink 中的一个信号源模块,用于生成正弦波信号。该模块可以根据设定的幅值、频率、相位和偏移量,在仿真过程中产生周期性的正弦波形。模块都能提供强有力的支持。通过深入了解其参数的影响及结合 MATLAB 脚本的应用,读者可以更加有效地利用这一模块进行仿真和研究。此外,通过实际应用场景的扩展以及常见问题解答部分的帮助,能够更好地掌握。模块是一个非常实用的工具,适用于需要生成正弦波信号的各种场景。模块的参数,可以进一步增强学习体验。模块参数的影响,下面我们将详细探讨每个参数如何影响仿真结果。

xiaoheshang_123的博客 1052

Mysql 调优记: INNER JOIN查询 Using temporary; Using filesort 问题优化

近期笔者在生产环境中发现一条执行非常慢的sql。大概时间为5s左右,于是乎对改SQL场景进行EXPLAIN 分析,发现一个在执行过程中出现对“Using temporary; Using filesort ”。即在执行过程中产生了临时表来存储结果,并在排序时根据连接类型以及存储排序键值和匹配条件的全部行的行指针来排序。经过合理对优化,最终EXPLAIN后,没有再发现明细对SQL性能瓶颈,并且SQL...

不能说的秘密的博客 1万+

MIMO-OFDM通信系统性能仿真及MATLAB实现

将MIMO和OFDM技术结合起来,可以充分利用两者的优点,进一步提高无线通信系统的性能。在MIMO-OFDM系统中,多个天线同时发射多个子载波,称为多天线多载波(MIMO-OFDM)系统。随着无线通信技术的不断发展,MIMO-OFDM技术因其高效、可靠和适应性等优点已被广泛应用于新一代通信系统中。本篇文章旨在介绍MIMO-OFDM通信系统的基本原理及其性能评估方法,并结合MATLAB提供相关代码实现。本篇文章介绍了MIMO-OFDM通信系统的基本原理和性能评估方法,并结合MATLAB提供了相关的实现代码。

学习使你进步。 2218

TC3XX - MCAL知识点(三十三):基于EB Tresos配置Tc3xx的MCAL代码如何产生中心对称的三相六路发波波形

本文用于记录如何在英飞凌 tc3xx 芯片的应用开发中,借助 EB Tresos 配置工具生成的配置代码与 MCAL 源码相结合,进而实现三相六路中心对称互补的 PWM 输出效果。外部资源需求:EB Tresos23.0以上、Tasking\Hightec编译器、示波器\逻辑分析仪。

梦想技术家 1212

mysql limit 索引失效_MySQL,针对limit优化,以及讨论using filesort、using temporary和索引失效的问题...

针对limit优化,以及讨论using filesort、using temporary和索引失效的问题表结构sqlCREATE TABLE `a` (`id` INT(11) NOT NULL AUTO_INCREMENT,`code` CHAR(36) DEFAULT NULL,`name` CHAR(20) DEFAULT NULL,PRIMARY KEY (`id`),KEY `code`...

weixin_36054993的博客 872

【stata基础代码大全 】 可独立完成一篇实证

用stata打开,直接替换自己需要的变量就行,小白友好❗️❗️❗️。八、八.中介效应检验:路径分析(三种方法)第二种方法即Sobel-Goodman检验。*(7)Winsor处理,剔除异常值。六、内生性问题解决方法(附具体模型)其三,工具变量:两阶段最小二乘。第三种方法即Bootstrap检验。二、Stata中数据的基本处理。*(5)生成行业、年度虚拟变量。PSM1————近邻匹配。七、调节效应检验:机制分析。*(2)剔除数据中的样本。*(4)给变量添加标签。*(3)生成新的变量。*(6)基本数据匹配。

J_Giser的博客 8025

MySQL SQL 优化实战:慢查询优化,从定位到解决

本文提供了一套完整的慢SQL优化实战流程:首先通过配置慢查询日志(临时/永久方式)抓取执行超时的SQL;然后使用EXPLAIN分析执行计划,重点关注type、key、rows等核心指标;针对全表扫描、文件排序等常见问题,给出了索引优化和SQL改写方案;最后形成"监控-分析-优化-验证"的闭环流程。文中详细说明了慢日志参数配置、执行计划解读方法,并提出了主键分页、关联字段索引等实用优化技巧,强调生产环境需设置合理阈值并建立持续监控机制。

2402_87794035的博客 178

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

MySQL索引失效的8种常见场景与优化实战

数据库索引是提升查询性能的核心技术,其本质是通过B+树等数据结构对数据进行预排序,实现快速数据定位。理解索引工作原理的关键在于掌握其有序性特点——索引按照列值顺序存储,优化器基于成本模型选择最优访问路径。在工程实践中,索引失效常导致性能瓶颈,典型场景包括隐式类型转换破坏字段类型一致性、对索引列使用函数或运算使其无法直接匹配存储值、以及模糊查询中通配符位置不当导致无法利用前缀匹配。例如,在慢查询排查中,常见因数据类型不匹配或对日期字段使用DATE()函数而触发全表扫描。通过合理设计复合索引遵循最左前缀原则、避

weixin_30552811的博客 359

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

MySQL SQL 从 EXPLAIN 到索引优化,搞懂 SQL 为什么慢

SQL查询性能优化核心要点: 1. 通过EXPLAIN分析执行计划,重点关注type、key、rows和Extra字段 2. 确保查询使用索引(避免ALL全表扫描),关注索引失效场景优先 3.使用覆盖索引减少回表 4.优化排序(避免Filesort)和分组(避免Temporary) 5.JOIN操作确保关联字段有索引 6,核心优化原则:减少数据扫描量、降低随机IO、减少CPU计算和排序开销 典型优化手段包括:合理设计索引、避免深分页、小表驱动大表等。通过系统化的调优流程可解决大多数慢SQL问题。

2302_80089018的博客 198

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

【Mysql】索引优化实战:从 320ms 到 130ms 的慢 SQL 改造

执行计划分析核心:重点关注 type(扫描方式)、key(索引是否生效)、rows(扫描行数)、Extra(临时表 / 排序 / 索引下推),这 4 个字段能快速定位瓶颈;复合索引设计原则:「过滤性优先→JOIN 字段→排序字段→查询字段」,遵循最左前缀匹配,避免范围条件后置;索引失效高频场景:函数操作、隐式转换、范围条件后的字段复用、模糊查询(% 开头)、OR 条件未全命中索引,需针对性规避;优化落地逻辑。

stone_tmp的博客 383

SQL优化全流程实战指南:从问题诊断到性能提升

本文系统介绍了SQL性能优化的完整方法论,涵盖问题诊断、优化技巧和实战案例。首先从系统监控和SQL特征识别性能问题,然后详细讲解获取慢SQL的工具与方法。核心部分提出9大SQL编写规范:合理使用索引、避免SELECT*、优化分页查询等,并分析8种索引失效场景。通过电商订单查询案例,演示从执行计划分析、索引优化到验证的完整流程,形成"发现问题-分析-优化-验证"的闭环。文章还指出5个常见误区(如"索引越多越好")并推荐官方文档、性能工具和学习资源,帮助开发者构建高性能数

ywl470812087的博客 11万+

mysql应用速查

分析:explain 关键字,explain+sql语句,会输出几列分析的数据,比如:先查id,再根据id查内容,不要直接Select *–对于数值型id,在分页基础上优化狂神说的例子:没有索引,100万条数据花了一秒左右,查了90多万行100个用户登录就要等100秒,这样好吗?这样不好创建了索引后,0.01秒就可以,只查了一行建立联合索引效率会更高,尤其是在数据量较大,单个列区分度不高的情况下在多表连接、where条件、排序、分组的字段上建立索引Where条件上不要使用运算函数,以免索引失效阿里巴巴的开发

阿巴阿巴 499

学习路之mysql--mysql优化,数据库优化

where a=3 and b like 'k%kk%' and c=5 Y,使用到a,b,c。where a=3 and b like 'kk%' and c=5 Y,使用到a,b,c。where a=3 and b like '%kk%' and c=5 Y,使用到a。where a=3 and b like '%kk' and c=5 Y,使用到a。where a=3 and b=5 and c=4 Y,使用到a,b,c。

Green 78

MySQL 提升SQL查询性能的全套实战优化方法

基于底层原理,整理线上最常用、最落地的SQL优化方案,所有方法均贴合真实业务场景,无空泛理论。

edwardwzw的博客 454

如何优化慢SQL?

尽量使用更小的数据类型(如能用 INT 就不用 BIGINT,用 VARCHAR 代替 CHAR),尽量设计为 NOT NULL。: 如果建立了联合索引 (a, b, c),查询条件必须从 a 开始,跳过 a 直接用 b 或 c 索引会失效。: 尽量让索引包含所有需要查询的字段(即 SELECT 的字段都在索引里),避免回表(先查索引再查聚簇索引)。: 针对高频、低频变动的数据,直接在应用层用 Redis 进行缓存,不走数据库。: 在 JOIN 操作中,用小表(数据量小的表)作为驱动表去连接大表。

小识的博客 3609

MySQL数据库开发实战:从SQL语法到索引优化与性能调优

在实际数据库开发中,很多开发者都经历过从只会写简单增删改查,到需要面对复杂查询、性能瓶颈和线上问题的阶段。MySQL作为最流行的开源关系型数据库,其核心在于如何高效、正确地使用SQL,并理解其背后的执行逻辑。本文旨在为希望系统掌握MySQL的开发者提供一个从环境搭建、语法入门到实战优化的清晰路径。我们将从最基础的安装配置开始,逐步深入到SQL核心语法、索引原理、查询优化以及生产环境常见问题的排查,目标是让你不仅能写出正确的SQL,更能写出高效的SQL,并具备初步的线上问题分析能力。 1. 理解MySQL:从

weixin_33672400的博客 498

MySQL Join 工作原理与性能优化实战

数据库Join操作是SQL查询中的核心操作,其性能直接影响系统响应速度。MySQL支持Nested Loop Join、Hash Join和Merge Join三种物理实现方式,其中Nested Loop Join是最常用的基础算法。理解Join执行流程和优化器工作原理是性能调优的关键,包括索引设计、执行顺序选择和小表驱动原则等。在实际工程中,Join优化需要结合索引策略(如覆盖索引)和查询改写(如子查询转Join),并通过EXPLAIN分析执行计划。针对大数据量场景,可采用分批处理、临时表等解决方案。掌握

csxc65837的博客 360

SQL慢查询7大性能杀手:索引失效与EXPLAIN实战优化

在数据库运维与后端开发中,慢查询是影响系统稳定性的高频痛点。当数据量增长或并发升高时,一条写法不佳的SQL可能导致CPU飙升、连接耗尽,甚至服务雪崩。问题的根源往往不在于硬件或数据量,而在于SQL本身触发了索引失效规则——例如SELECT *全字段检索、隐式类型转换、前导通配符LIKE、索引列函数运算、OR条件拼接、深分页LIMIT offset以及应用层N+1循环查询。这些模式会迫使数据库放弃B+树索引,退化为全表扫描,执行计划中type字段表现为ALL,rows估算剧增。而EXPLAIN是识别这些隐患的

weixin_34245749的博客 343
上一篇: mysql索引原理及查询优化
下一篇: java中的编译时异常和运行时异常
冷down
博客等级 码龄10年 11粉丝 18原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值