mysql explain索引优化详解

ES快速入门,一篇就懂! Elastic Search 入门前言什么是搜索为什么常用数据库不适合做搜索什么是Lucene什么是Elastic SearchES核心概念ES使用正常启动索引​增删改查ES增加常见问题:ES删除ES查询欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的 阅读详情

最近遇到和原创一样的问题按照下面做法解决,转发方便自己和群众

MySQL 数据库,MyISAM 类型的表 table_item,有 5、6 个字段,主键是 id。user_id 和 item_id 两个字段都是单独的 INDEX 类型的索引。


问题是如何发现的?
今天搞程序,在自己的开发环境下,打开一个简单的页面都要好长时间,不知道问题出在哪里,只发现硬盘灯闪个不停。
观察 Windows 的任务管理器,看到 mysqld-nt.exe 这个进程的 “I/O 读取字节” 高达十几 G!!!
再次测试,发现每次刷新页面,这个进程要读取几十 M 的数据。
奇了怪了,查看 SQL 语句,还有表结构,字段都建了索引了呀。
后来 EXPLAIN 了一下,看到结果是 Using where; Using filesort。
explain SELECT * FROM table_item WHERE user_id = 2 ORDER BY item_id LIMIT 0, 5
翻了 MySQL 手册,仔细看下 filesort 的说明,知道了 Using filesort 是一种速度很慢的外部排序。
不过我不理解为什么会使用 filesort 排序,WHERE 和 ORDER BY 用到的字段都是有索引的呀。
赶紧 Google,找到几篇解释 Using filesort 的文章,得到的启示就是索引定义不当,MySQL 没有用到索引。
记得以前 Chenbin 给俺们培训过 MySQL 的优化,我还参加了两次,总感觉自己了解了如何优化 MySQL,没想到这么简单的语句我都没能优化。
现在想起来一些 MySQL 的特性了。
?? 1. 一条 SQL 语句只能使用 1 个索引 (5.0-),MySQL 根据表的状态,选择一个它认为最好的索引用于优化查询
?? 2. 联合索引,只能按从左到右的顺序依次使用
这 2 点刚好可以解决我的问题。
user_id 和 item_id 是 2 个索引,我的语句中,MySQL 选择了 user_id,那么 item_id 的索引没有起到任何用处,所以,当我要排序的时候,由于记录数较多,内存中的排序 buffer 满了,只能 Using filesort 进行外部排序,因此每次查询要从磁盘读取几十 M 的数据,太慢了。
修改表结构,删除 user_id 和 item_id 的 INDEX 索引,建立一个名为 user_item 的联合 UNIQUE 索引,顺序是先 user_id 后 item_id,再 EXPLAIN,这回只有 Using where 了。
再刷新页面,观察任务管理器,mysqld-nt.exe 只读取了 2K 的数据,页面咔的一下就出来了……
关于索引:
一条sql语句里面关联的表每个表只能用一个索引,5.0之后如果查询条件里面有多个索引字段,mysql会尝试进行 index merge,同时使用几个索引的合集。在explain我们所使用的sql的时候,经常会遇到using filesort这种情况,原来我以为是由于有相同的列值的原因引起的,结果昨天看到公司的一个sql,跟同事讨论了一下加上自己又做了一些测试,突然发现自己原来的想法是错的。
首先,只有在order by 数据列的时候才会出现using filesort,而且如果你不对进行order by的这一列设置索引的话,无论列值是否有相同的都会出现using filesort。因此,只要用到order by 的这一列都应该为其建立一个索引。
其次,在这次测试中,使用了一个稍微有点复杂的例子来说明这个问题,下面详细用这个例子说一下:
SELECT * FROM DB.TB WHERE ID=2000010000 AND FID IN (9,8,3,13,38,40) ORDER BY INVERSE_DATE LIMIT 0, 5
里面建立的索引为一个三列的多列索引:IDX(ID,FID ,INVERSE_DATE) 。INVERSE_DATE这个是时间的反向索引。
对于这个sql我当时最开始认为应该是个优化好的状态,应该没有什么纰漏了,结果一explain才发现竟然出现了:Using where; Using filesort。
汗。。。为什么呢,后来经过分析才得知,原来在多列索引在建立的时候是以B-树结构建立的,因此建立索引的时候是先建立ID的按顺序排的索引,在相同ID的情况下建立FID按 顺序排的索引,最后在FID 相同的情况下建立按INVERSE_DATE顺序排的索引,如果列数更多以此类推。有了这个理论依据我们可以看出在这个sql使用这个IDX索引的时候只是用在了order by之前,order by INVERSE_DATE 实际上是using filesort出来的。。汗死了。。因此如果我们要在优化一下这个sql就应该为它建立另一个索引IDX(ID,INVERSE_DATE),这样就消除了using filesort速度也会快很多。。问题终于解决了。。- -!
第4课 SiC MOSFET的动态特性——关断过程 本文分析了SiC MOSFET的关断过程,将其划分为四个阶段:栅源电容放电阶段(t6-t7)、米勒平台阶段(t7-t8)、电压过冲阶段(t8-t9)和换流结束阶段(t9-t10)。通过等效电路详细描述了各阶段的电压电流变化特点。同时探讨了MOSFET的极间电容特性,包括输入电容Ciss、输出电容Coss和反向转移电容Crss,分析了它们对器件开关速度、损耗及电压变化速率的影响。研究指出这些非线性电容会显著影响器件的动态性能。 阅读详情

相关推荐

MQTT与物联网平台(一):基础知识和设备接入物联网平台的实现(以华为云为例)

本文简单介绍了MQTT的基础知识和使用方法,以蓝牙WIFI双模芯片W801作为硬件设备,接入到华为云。

weixin_50622833的博客 1万+

MySQL 索引优化 Using where, Using filesort

用Explain分析SQL语句的时候,经常发现有的语句在Extra列会出现Using filesort,根据MySQL官方文档对他的描述: 引用 MySQL must do an extra pass to find out how to retrieve the rows in sorted order. The sort is done by going through all rows according to the join type and storing the sort key and po

西西工作室 6871

谷粒商城篇章9 ---- P248-P261/P292-P294 ---- 消息队列【分布式高级篇六】

RabbitMQ消息队列、RabbitMQ延时队列。

weixin_48568302的博客 1549

四、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万+

生成式引擎优化(GEO)全流程解析

生成式引擎优化(GEO)已成为AI时代数字营销新趋势,通过优化企业内容以提升在AI生成答案中的引用率。本文系统梳理了GEO优化的完整流程,包括:1)前期准备与市场调研;2)数据治理与知识库构建;3)模型适配与算法优化;4)内容权威性建设;5)本地化营销;6)效果监测与优化。研究显示,实施GEO的企业AI曝光率提升62%,转化率增长2.3倍。未来GEO将向多模态内容、实时个性化、垂直场景深化方向发展。企业需建立动态知识图谱,采用结构化数据标记,持续优化内容策略,以在AI搜索时代获取流量优势。

解锁AI流量新红利!🚀 GEO优化(生成引擎优化)助您掌控AI搜索,让AI成为您的品牌最佳代言人! 3246

HFSS螺旋线圈的优化设计与高效仿真实践

本文详细介绍了HFSS螺旋线圈的优化设计与高效仿真实践,涵盖核心参数设置、参数化建模、仿真加速技巧及结果分析。通过HFSS软件实现螺旋线圈的高效仿真,特别适用于无线充电和RFID系统设计,提升设计效率与性能验证准确性。

weixin_30235225的博客 444

明明白白告诉你MySQL索引效率分析和使用原则

EXPLAIN语句的基本语法如下:使用EXTENED关键字,EXPLAIN语句将产生附加信息。select_options 是SELECT语句的查询选项,包括FROM WHERE子句等。执行该语句,可以分析EXPLAIN后面的SELECT语句的执行情况,并且能够分析出所查 询的表的一些特征。使用EXPLAIN语句来分析1个查询语句,执行如下语句:下面我们对查询结果进行解释: 性能判定依据主要字段信息不同值的解释: 查询效率大概的顺序为:USING index 查询效率最高Using where 次于...

嗨皮螃的博客 5915

GD32F470实战:如何用EXMC+SDRAM搞定LVGL大内存需求(附完整代码)

本文详细介绍了如何在GD32F470微控制器上通过EXMC接口驱动外部SDRAM,以满足LVGL图形库的大内存需求。内容涵盖硬件连接、EXMC时序配置、轻量级内存管理器实现,以及将LVGL帧缓冲和资源无缝集成到SDRAM的实战方法,并提供了完整的代码示例和调试技巧,帮助开发者构建稳定可靠的嵌入式GUI系统。

k9l0m1的博客 442

using where和 using filesort

MySQL 数据库,MyISAM 类型的表 table_item,有 5、6 个字段,主键是 id。 user_id 和 item_id 两个字段都是单独的 INDEX 类型的索引。 问题是如何发现的? 今天搞程序,在自己的开发环境下,打开一个简单的页面都要好长时间,不知道问题出在哪里,只发现硬盘灯闪个不停。 观察 Windows 的任务管理器,看到 mysqld-nt.exe 这个进程的

qq51931373的专栏 2959

adas硬件_ADAS智能辅助驾驶系统硬件在环(HIL)测试之硬件介绍

这篇主要分享的是ADAS融合系统的HIL测试系统的硬件结构及其作用,其主要包括上位机、机柜、雷达模拟器系统、雷达暗箱系统以及视频暗箱。 上位机 上位机主要运行HIL测试系统的相关软件,测试人员所有的前期准备工作与测试操作均在上面进行,并监控测试结果,其通过网口实现与NI实时机的通信,上位机将VeriStand项目工程下载至NI实时机运行。机柜 机柜主要由可编程电源...

weixin_39580748的博客 2242

【数据分析/商业分析】面试题整理——SQL专题

数据分析\商业分析—面试题整理 自己总结的SQL类的面试题 文章目录数据分析\商业分析—面试题整理1.新增用户2.活跃用户数量3.连续登录4.次(n)日留存5.每个科目下分数最高的两名学生

awater_17的博客 1859

MySQL进阶(三)——索引优化分析(性能分析)

本篇文章主要是对MySQL学习时的一些总结,作为学习笔记记录。 性能下降原因 对于某些sql语句来说,会导致执行时间长,等待时间长的后果,从而造成整个sql语句的性能下降。导致sql性能下降的原因主要有: 查询数据过多:能不能拆分,降低过滤条件 关联了太多的表,太多join:使用之前尽量先过滤 没有利用到索引(单值,复合) 索引是针对列建立的,但并不可能对所有的数据列都建立索引 同时索引也并不是越多越好,数据更新的同时,索引也会进行调整,因此过多的索引会降低性能 而mysql也不会使用到

止步听风的博客 1301

数据预处理的分箱操作

数据分箱 介绍 我们在建立模型前,一般需要对特征变量进行离散化,特征离散化后,模型会更稳定,降低模型过拟合的风险。尤其是采用 logsitic 建立评分卡模型时,必须对连续变量进行离散化。而特征离散化处理通常采用的就是分箱法,数据分箱(也称为离散分箱或分段)是一种数据预处理技术,用于减少次要观察误差的影响,提高泛化性。 数据分箱又分为有监督分箱和无监督分箱,是否使用标签进行离散化(分箱)决定了有监督还是无监督的离散化方法。 知识点 无监督分箱 split 分箱 merge 分箱 无监督分箱 这里为了

随笔记 5332

MySQL的Explain详解与索引优化最佳实践

SQL语句优化第n步必做的事

weixin_52465547的博客 1310

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

MySQL 索引优化(Explain执行计划) 详细讲解

MySQL 索引优化(Explain执行计划) 详细讲解

感谢阅读 1948

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Mysql优化之Explain详解、索引最佳实践

使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈,在 select 语句之前增加 explain 关键字,MySQL 会在查询上设置一个标记,执行查询会返回执行计划的信息,而不是执行这条SQL。

Z_Lisa的博客 1万+

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

[MySQL总结] Explain详解、索引最佳优化

like KK%相当于=常量,%KK和%KK% 相当于范围。

qq_45061342的博客 2031

EXPLAIN 解码:MySQL 索引优化的黄金决策术

MySQL索引优化核心:通过EXPLAIN精准诊断查询瓶颈。关键点: 重点关注EXPLAIN的type列(避免ALL全表扫描)、key列(索引选择情况)和Extra列(隐藏问题如filesort) 实战案例演示:通过添加复合索引(customer_id,order_date)解决排序性能问题,查询从2.8秒降至0.02秒 进阶技巧:覆盖索引设计、最左前缀原则应用、索引下推技术 优化黄金法则:先诊断后优化、覆盖完整查询路径、权衡读写性能、定期动态调整 通过科学分析EXPLAIN结果,可针对性制定索引策略,显著

2301_79835463的博客 2070

mysql优化之explain 以及 索引优化

因为存储引擎不能使用索引中范围条件右边的列索引列是name,age,position,上面key_len没有等于140,说明索引未被充分使用。因为当第二个列是范围,从索引树中可看出第三个列就可能不是顺序的了,所以第三列不能被使用,建议范围查询的索引列放到最后,改成name,position,age5.尽量使用覆盖索引(只访问索引的查询(索引列包含查询列)),减少 select * 语句使用覆盖索引可以避免回表的开销第一个Extra显示使用到了覆盖索引,第二个未使用到;

myStyle的博客 1832

mysql优化二:Explain详解和索引优化

文章目录Explain详解和索引优化Explain详解简介Explain 中重要的参数 Explain详解和索引优化 Explain详解 简介 使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈 在 select 语句之前增加 explain 关键字,MySQL 会在查询上设置一个标记,执行查询会返回执行计划的信息,而不是 执行这条SQL。 注意:如果 from 中包含子查询,仍会执行该子查询,将结果放入临时表中。 参考官方文档: https://dev.mysql.

admin522043032的博客 578

MySQL Explain详解与索引优化实战

MySQL的EXPLAIN工具是SQL性能优化的关键,它能显示查询的执行计划而不实际执行SQL。该工具通过分析id、select_type、type等列信息,帮助开发者识别查询效率问题。重点包括:type列反映访问类型,应至少达到range级别;联合索引遵循最左前缀原则;避免在索引列上使用函数或计算;范围查询会导致右边列索引失效;LIKE以通配符开头会索引失效。MySQL 8.0优化器行为有所变化,需实际测试验证。建议开发者在编写SQL时使用覆盖索引、合理设计查询条件,并定期分析慢查询日志进行持续优化。

alonewolf_99的博客 810

MySQL - 索引详解以及优化;Explain执行计划

一般就是在你的where语句中出现了between、、in等的查询这种范围扫描索引扫描比全表扫描要好,因为它只需要开始于索引的某一点,而结束语另一点,不用扫描全部索引。在索引大大提高查询速度的同时,却会降低表的更新速度,在对表进行数据增删改的同时,MySQL不仅要更新数据,还需要保存一下索引文件。id相同和不同都存在时,id相同的可以理解为一组,从上往下顺序执行,所有组中,id值越大,优先级越高越先执行。索引实际上也是一张表,保存了主键和索引的字段,并且指向实体表的记录,所以索引也是需要占用空间的。

MinggeQingchun的博客 720

Mysql详解Explain索引优化最佳实践

目录 1 Explain工具介绍 2 explain 两个变种 3 explain中的列 3.1 id列 3.2 select_type列 3.3 table列 3.4. type列 3.5 possible_keys列 3.6 key列 3.7 key_len列 3.8 ref列 3.9 rows列 3.10 Extra列 4 索引最佳实践 4.1.全值匹配 4.2.最左前缀法则 4.3.不在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫描

赵广陆 1557

Explain详解与MySQL索引优化最佳实践

使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈在 select 语句之前增加 explain 关键字,MySQL 会在查询上设置一个标记,执行查询会返回执行计划的信息,而不是执行这条SQL注意:如果 from 中包含子查询,仍会执行该子查询,将结果放入临时表中like KK%相当于=常量,%KK和%KK% 相当于范围-- mysql5.7关闭ONLY_FULL_GROUP_BY报错本文文档:【有道云笔记】01-Explain详解与索引优化最佳实践有道云笔记。

输入知识,消化知识,输出知识,分享知识,教人让我学习更好,业精于勤荒于嬉,行成于思毁于随 987

【MySQL】Explain详解与索引优化实战

目录 1、使用的表 2、explain 中的列 2.1 id列 1)简单子查询 2)from子句中的子查询 3)union查询 2.2 select_type列 2.3 table列 2.4 type列 2.5 possible_keys列 2.6 key列 2.7 key_len列 2.8 ref列 2.9 rows列 2.10 Extra列 3、索引优化实战 ...

小七的博客 1486

MySQL索引优化explain分析

为什么你写的sql查询慢?为什么你建的索引常失效?通过本章内容,你将学会MySQL性能下降的原因,索引的简介,索引创建的原则,explain命令的使用,以及explain输出字段的意义。助你了解索引,分析索引,使用索引,从而写出更高性能的sql语句。还在等啥子?撸起袖子就是干! 案例分析 我们先简单了解一下非关系型数据库和关系型数据库的区别。 MongoDB是NoSQL中的一种。NoSQL的全...

php阿宝的博客 1298
上一篇: Windows下DVWA安装指南 工具
下一篇: mysql索引删除,修改,添加
vm021
博客等级 码龄11年 6粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值