Mysql数据库性能优化神器——explain关键字

Explain工具介绍

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

Explaion分析示例

-- actor建表语句:CREATE TABLE `actor` (  `id` int(11) NOT NULL,  `name` varchar(45) DEFAULT NULL,  `update_time` datetime DEFAULT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8
-- film建表语句:CREATE TABLE `film` (  `id` int(11) NOT NULL,  `name` varchar(10) NOT NULL,PRIMARY KEY (`id`),  KEY `idx_name` (`name`))ENGINE=InnoDB DEFAULT CHARSET=utf8
-- film_actor建表语句:CREATE TABLE `film_actor` (  `id` int(11) NOT NULL,  `film_id` int(11) NOT NULL,  `actor_id` int(11) NOT NULL,  `remark` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`),KEY `idx_film_actor_id` (`film_id`,`actor_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8

执行explain:

explain select * from actor;

explain01.jpg

如果是select语句返回的是执行结果,在select语句前面加上explain返回的是这条查询语句的执行SQL。

EXPLAIN两个变种

1、explain extended

会在explain的基础上额外提供一些查询优化的信息。紧随其后通过show warnings命令可以得到优化后的查询语句,从而看出优化器优化了什么。额外还有filtered列,是一个半分比的值,rows*filtered / 100可以估算出将要和explain中前一个表进行连接的行数(前一个表指explain中的id值比当前表id值小的表)。

explain EXTENDED select * from actor where id = 1;

explain02.jpg

2、explain partitions

相比explain多了个partitions字段,如果查询是基于分区表的话,会显示查询将访问的分区。

Explain中的列

id列

id列的编号是select的序列号,有几个select就有几个id,并且id的顺序是按select出现的顺序增长的。
id越大执行优先级越高,id相同则从上往下执行,id为NULL最后执行。

explain select (select 1 from actor where id = 1) from (select * from filmwhere id = 1) der;

explain03.jpg

select type列

select type表示对应行是简单还是复杂的查询。
simple:简单查询。查询不包含子查询和union。

explain select * from film where id=1

explain04.jpg

primary:复杂查询中最外层的select
subquery:包含在select中的子查询(不在from子句中)
derived:包含在from子句中的子查询。MySQL会将结果存放在一个临时表中,也称为派生表

explain select (select 1 from actor where id = 1) from (select * from filmwhere id = 1) der;

explain05.jpg

union:在union关键字随后的selelct。

EXPLAIN select 1 union all select 1;

explain06.jpg

table列

这一列表示explain的一行正在访问哪个表。
当from子句中有子查询时,table列是格式,表示当前查询依赖id=N的查询,于是先执行id=N的查询。
当有union时,UNION RESULT的table列的值为,1和2表示参与union的select行id。

type列

这一列表示关联类型或访问类型,即MySQL决定如何查找表中的行,查找数据行对应的大概范围。
依次从最优到最差的分别为:system>const>eq_ref>ref>range>index>All
一般来说,得保证查询达到range级别,最好达到ref。
NULL:MySQL能够在优化阶段分解查询语句,在执行阶段用不着在访问表或索引。例如:在索引列中选取最小值,可以单独查找索引来完成,不需在执行时访问表

EXPLAIN select min(id) from film;

explain07.jpg

constsystem:mysql能对查询的某部分进行优化并将其转换成一个常量(可看成是show warnings的结果)。用于primay key或unique key的所有列与常数比较时,所以表最多有一个匹配行,读取1次,速读较快。system 是const的特例,表中只有一行元素匹配时为system。

EXPLAIN select * from (select * from film where id= 1) as tmp;

eq_ref:primay key或 unique key索引的所有部分被连接使用,最多只会返回一条符合条件的记录。这可能是const之外最好的联接类型,简单的select查询不会出现这种type。

EXPLAIN select * from (select * from film where id= 1) as tmp;

explain08.jpg

ref:相比eq_ref,不适用唯一索引,而是使用普通索引或者唯一索引的部分前缀,索引要和某个值相比较,可能会找到多个符合条件的行。
简单select查询,name是普通索引(非主键索引或唯一索引)

EXPLAIN select * from film where name='film1';

explain09.jpg

关联表查询,idx_film_actor_id是film_id和actor_id的联合索引,这里使用到了film_actor的左边前缀film_id部分。

EXPLAIN select film_id from film LEFT JOIN film_actor on film.id = film_actor.film_id;

explain10.jgp.jpg

range:范围扫描通常出现在in(), between,>,=等操作中。使用一个索引来检索给定范围的行。

EXPLAIN select * from actor WHERE id >1;

explain11.jpg

index:扫描全表索引,通常比All快一些

EXPLAIN select * from film;

expalin12.jgp.jpg

all:即全表扫描,意味着MySQL需要从头到尾去查找所需要的行。这种情况下需要增加索引来进行优化。

explain select * from actor;

explain12.jpg

possible_keys列

这一列显示select可能会使用哪些查询来查找。
explain时可能会出现possible_keys有列,而key显示为NULL的情况,这种情况是因为表中的数据不多,MySQL认为索引对此查询帮助不大,选择了全表扫描。
如果该列为NULL,则没有相关的索引。这种情况下,可以通过检查where子句看是否可以创造一个适当的索引来提高查询性能,然后用explain查看效果。

EXPLAIN SELECT * from film_actor where film_id =1;

explain13.jpg

key列

这一列显示MySQL实际采用哪个索引对该表的访问。
如果没有使用索引,则改列为NULL。如果想强制MySQL使用或忽视possible_keys列中的索引,在查询中使用force indexignore index

腾讯Effidit 腾讯Effidit

腾讯AI Lab开发的AI写作助手,提升写作者的写作效率和创作体验

腾讯Effidit 65 查看详情 腾讯Effidit

key_len列

这一列显示了mysql在索引里使用的字节数,通过这个值可以估算出具体使用了索引中的哪些列。

EXPLAIN SELECT * from film_actor where film_id =1;

explain14.jpg

film_actor的联合索引idx_film_actor_id由film_id和actor_id两个id列组成,并且每个int是4字节。通过结果中的key_len=4可推断出查询使用了第一个列:film_id列来执行索引查找。

ken_len计算规则如下:

字符串
char(n):n字节长度
varchar(n):n字节存储字符串长度,如果是utf-8, 则长度是3n+2

数值类型
tinyint:1字节
smallint:2字节
int:4字节
bigint:8字节

时间类型
date:3字节
timestamp:4字节
datetime:8字节

如果字段允许为NULL,需要1字节记录是否为NULL
索引最大长度是768字节,当字符串过长时,MySQL会做一个类似做前缀索引的处理,将前半部分的字符串提取出来做索引。

ref列

这一列显示了在key列记录的索引中,表查找值所用到的列或常量,常见的有: const(常量),字段名等。一般是查询条件或关联条件中等号右边的值,如果是常量那么ref列是const,非常量的话ref列就是字段名。

EXPLAIN SELECT * from film_actor where film_id =1;

explain15.jpg

row列

这一列是mysql估计要读取并检测的行数,注意这个不是结果集的行数。

Extra列

这一列是额外信息。

Using index:使用覆盖索引(结果集的字段是索引,即select后的film_id)

explain select film_id from film_actor where film_id=1;

explain16.jpg

Using index condition:查询的列不完全被索引覆盖,where条件中是一个前导的范围

explain select * from film_actor where film_id > 1;

explain17.jpg

Using where:使用where语句来处理结果,查询的列未被索引覆盖

explain select * from actor where name ='a'

explain18.jpg

Using temporary:mysql需要创建一张临时表来处理查询。出现这种情况一般要进行优化,首先要想到是索引优化。

explain select DISTINCT name from actor;

explain19.jpg

actor.name没有索引,此时创建了临时表来处理distinct。

explain select DISTINCT name from film;

explain20.jpg

file.name建立了普通索引,此时查询时Extra是Using index,没有用到临时表。

Using filesort:将用外部排序而不是索引排序,数据较小时从内存排序,否则需要在磁盘完成排序。这种情况下一般也是要考虑使用索引来优化的。

explain select * from actor order by name;

explain21.jpg

actor.name未创建索引,会浏览acotr整个表,保存排序关键字name和对应id,然后排序name并检索行记录。

explain select * from film order by name;

explain22.jpg

film.name建立了idx_name索引,此时查询时extra是Using index。

select tables optimized away:使用某些聚合函数(比如:max、min)来访问存在索引的某个字段

explain select min(id) from film ;

explain23.jpg

有兴趣的同学可以访问PHP中文网了解更多相关内容:Mysql视频教程

以上就是Mysql数据库性能优化神器——explain关键字的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1078458.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月2日 17:24:39
下一篇 2025年12月2日 17:25:14

相关推荐

  • RUVI AI:经过审核的令牌吸引了2025年的智能投资者

    了解ruvi ai(ruvi)如何在区块链与ai融合的现实世界应用中脱颖而出,成为顶级加密货币竞争者。它是否是2025年的明智投资? 经过审计的代币,智能投资者对Ruvi AI的关注正在上升,这并非偶然。该项目通过结合区块链和人工智能技术,在竞争激烈的加密市场中独树一帜。 为何Ruvi AI引人注目…

    2025年12月8日
    000
  • 故事激增,鲸鱼购买和代币:解码最新的加密动作

    深入了解最新加密趋势:ip代币崛起、鲸鱼活跃与市场乐观情绪升温。这是否预示着加密投资的未来方向? 在不断变化的加密货币领域中,紧跟趋势是成功的关键。最近热议的话题集中在“故事代币上涨、鲸鱼买入和市场反弹”上,让我们来剖析一下背后发生了什么,以及它对你的意义。 IP代币崭露头角 在短短24小时内,St…

    2025年12月8日
    000
  • 德克萨斯州全力以赴:比特币储备信号大国拥抱

    德克萨斯州正式设立比特币储备,与新罕布什尔州和亚利桑那州并肩,迈出了将数字资产纳入国家财政体系的重要一步。 全力推进:比特币储备彰显德克萨斯州的前瞻性布局 您好,加密货币爱好者们!德克萨斯州最近正式宣布成立“战略比特币保护区”,标志着其在数字货币领域迈出大胆步伐。州长格雷格·雅柏(Greg Abbo…

    2025年12月8日
    000
  • 网络安全崩溃:Hacken的私钥崩溃和Web3的OPSEC危机

    hacken最近遭遇的私有密钥泄露事件再次凸显了web3领域中关键的网络安全弱点,突显出加强操作安全措施的紧迫性。 网络安全崩盘:Hacken的私钥泄露与Web3的OPSEC危机 Web3世界再次被震惊——一家以网络安全为主业的公司竟然也成为私有密钥被盗的受害者。其结果是,HAI代币价格暴跌近98%…

    2025年12月8日
    000
  • 未固定的预售主导:XRP,ARB和UNSD的兴起的市场见解

    unstaked的1,040万美元预售正在掀起热潮,甚至超越了xrp可能的突破与arb的增长势头。那么,unstaked是否已经准备好在2025年主导加密货币市场? Unstaked预售引领风潮:XRP、ARB与UNSD的崛起市场分析 加密货币市场正热烈讨论中!Unstaked的火爆预售正在成为焦点…

    2025年12月8日
    000
  • Dogecoin vs. Ruvi AI:被审核的令牌竞赛至$ 1

    dogecoin的meme魅力遭遇ruvi ai的审计创新。哪一枚代币将率先突破1美元?来一探究竟! 作为模因币的元老级角色,Dogecoin长期以来深受喜爱。不过,现在场上出现了新面孔!Ruvi AI作为一个经过审核的代币强势登场,有人认为它可能在冲上1美元估值的路上,把狗狗币远远甩在身后。让我们…

    2025年12月8日
    000
  • Ruvi AI:新的雪崩?审核和AI Spark Crypto辩论

    ruvi ai:能否撼动雪崩的地位?审计与ai融合引发加密圈热议 Ruvi AI:新晋挑战者?审核认证与AI技术点燃加密货币话题 雪崩在加密领域一直占据重要位置,而如今Ruvi AI正强势入场。借助人工智能驱动的创新模式、顺利通过的安全审计以及令人期待的预售表现,Ruvi AI是否真的有能力挑战雪崩…

    2025年12月8日
    000
  • RUVI AI:革命性的加密货币空间中的ROI预测

    ruvi ai是否属于如比特币和狗狗币等建立的加密货币?探索其创新方法与实际应用如何影响roi预测。 RUVI AI:在加密领域中引领ROI预测的革新力量 Ruvi AI(Ruvi)正在成为加密市场中一个潜在的重要角色,将区块链技术与人工智能融合。一些行业观察家认为,凭借其明确的发展蓝图和实用价值,…

    2025年12月8日
    000
  • BlockDag,加密硬币和领先趋势:2025年有什么热门?

    探索2025年加密货币的主要趋势,聚焦blockdag引人注目的预售表现,并深入探讨宇宙、cronos、cronos、渲染、shiba inu以及web3 ai的发展前景。 BlockDag,加密币与前沿趋势:2025年的热门看点 加密领域持续演变,2025年成为关键的一年。让我们深入了解正在引发关…

    2025年12月8日
    000
  • Ruvi AI:这是否有能力为更大的ETH收益而做好准备吗?

    分析师热议ruvi ai(ruvi)及其惊人的roi潜力。它真能超越以太坊吗? Ruvi AI:是否具备挑战ETH的潜力? 随着加密市场持续演变,一个新晋力量正在崛起——Ruvi AI(Ruvi)。初步预测释放出可观回报信号,业内人士开始思考,以太坊能否继续保持领先?Ruvi AI会是下一个风口吗?…

    2025年12月8日
    000
  • XRP,价格模型和Stablecoins:在2025年导航加密货币景观

    看看xrp的潜力,创新的stablecoin策略以及不断发展的加密货币市场中新兴的altcoin挑战者。 加密世界永远不会停歇!让我们深入探讨XRP相关的最新动态,挖掘一些有趣的价格模型讨论,并展望Stablecoins如何焕发新生。准备好迎接这场数字资产风暴了吗? XRP赎回之路充满挑战(或可达1…

    2025年12月8日
    000
  • 杜格鲸鱼灾难,Sui价格滑倒和未固定的AI:加密货币的狂野骑行

    dogecoin 出现卖出信号,sui 价格徘徊于 3 美元下方,而 unstaked 的 ai 智能代理正带来 web3 可扩展性的新突破。实用性是否终于战胜了名气? 模因币鲸鱼出逃、Sui价格下跌与Unstaked的AI革新:加密世界的动荡之旅 加密货币市场总是充满波动性,对吧? Dogecoi…

    2025年12月8日
    000
  • XRP投资:1万美元可以变成100万美元吗?

    XRP投资:1万美元能否逆袭成百万富翁? 投资1万美元在XRP上,是否有机会实现一百万美元的回报?通过分析价格预测与市场动向,我们来看看这样的收益是否具备可能性。 XRP带来的百万梦想 每一位XRP持有者心中都藏着一个疑问:一笔看似普通的投入,真能带来人生转折的财富吗?我们将探讨目标、预期及通往百万…

    2025年12月8日
    000
  • 加密升温:Blockdag的预售,Aptos的Stablecoin飞行员等等!

    深入了解最新加密货币动态:blockdag预售亮眼,aptos参与稳定币试点,bnb、algo、avax与rndr前景解析 加密领域再度热闹非凡!从BlockDag预售筹集巨资,到Aptos入选怀俄明州稳定币试点计划,再到BNB、Algo、Avax和RNDR的最新进展,一切精彩不容错过。让我们一同深…

    2025年12月8日
    000
  • 加密货币奖励者,表现最佳的人和投资者的目标:现在有什么热门?

    查看最高加密货币的收获,投资者如何针对它们以及推动其表现的趋势。 加密货币奖励者,表现最佳的人和投资者的目标:现在有什么热门? 加密市场正处于活跃状态,聪明的投资者正专注于识别顶级加密货币资产,并研究如何投资它们!这不仅仅是追逐热点;而是关注那些展现出真实增长潜力的项目,并拥有坚实的数据支撑和执行力…

    2025年12月8日
    000
  • Web3 AI加热,而Shib保持扎根,ETH则定居:什么是游戏?

    web3 ai正在利用其ai赋能的技术掀起波澜,shiba inu(shib)试图实现突破,而以太坊(eth)则逐渐趋于稳定。探索加密货币的最新动态! 加密领域正热闹非凡!Web3 AI凭借其前沿的人工智能工具引发关注,Shiba Inu(SHIB)寻求强势反弹,而以太坊(ETH)则展现出更强的稳定…

    2025年12月8日
    000
  • Ruvi AI:下一个二手硬币?象征性的集会观看

    ruvi ai因其功能性、增长前景及创新策略,常被拿来与币安币进行比较。它是否具备参与类似代币热潮的条件? Ruvi AI:下一个潜力币?关注象征性反弹机会 在瞬息万变的加密货币市场中,发现下一个爆发点是投资者的目标。“Ruvi AI,币安币,doken Rally”已成为热门关键词。Ruvi AI…

    2025年12月8日
    000
  • Dogwifhat(WIF)价格预测:Falling Wedge提供希望在市场波动中的希望

    dogwifhat(wif)在市场波动中应对楔形形态。它会实现突破,还是面临看跌压力?获取最新分析。 Dogwifhat(WIF)价格展望:下跌楔形为波动市场带来一线希望 Dogwifhat(WIF)正经历市场的剧烈波动,并形成一个下降的楔形结构,这或许预示着一丝转机。但这一模式是否会引发反弹,还是…

    2025年12月8日
    000
  • AI,Defi和令牌:用$ oz及以后的加密货币中的下一波浪潮

    探索ai、defi与代币的融合趋势,重点关注ozak ai($oz)和mutuum finance(mutm)等项目,并对virtuals协议(virtual)进行审慎分析。 加密世界正在不断演进,精明交易者正逐步远离模因驱动的炒作,转向具有现实应用价值的项目。AI、DEFI与代币的交汇点正孕育出令…

    2025年12月8日
    000
  • 雪崩,Ruvi AI和审计令牌:一个新时代?

    与雪崩在加密领域的持续演进相比,ruvi ai的崭露头角及其审计状态和潜在影响值得关注。 雪崩、Ruvi AI与审计代币:迈向新时代? 当前的加密领域充满活力,“雪崩、Ruvi AI、审计代币”正成为众人热议的话题。我们一起来看看这场变革背后的推动力。 雪崩的发展与Ruvi AI的登场 雪崩(Ava…

    2025年12月8日
    000

发表回复

登录后才能评论
关注微信