oraclesql执⾏计划分析_sql执⾏计划explain详解
概述explain执⾏计划详解使⽤慢查询分析(⾮常实⽤)MYSQL的事务配置项php7进阶到架构师相关阅读
概述
这是关于php进阶到架构之Mysql进阶学习的第六篇⽂章:sql执⾏计划explain详解
第⼀篇:mysql共享锁及排它锁第⼆篇:mysql事务及隔离级别第三篇:mysql底层BTree与B+Tree实现原理第四篇:mysql索引详解第五篇:mysql最全索引优化技巧sql执⾏计划explain详解
explain执⾏计划包含的信息
explain执⾏计划包含的信息如上图,包含了id,select_type,table,type,possible_keys,key,key_len,rows,extra这些信息。
matlab二元隐函数绘图其中最重要的信息为:id、type、key、rows、Extra
id字段详解
id字段表⽰select查询的序列号,包含⼀组数字,表⽰查询中执⾏select⼦句或操作表的顺序。
EXPLAIN SELECTa.id,a.title,b.imagesFROMs_goods AS a,s_goods_photo AS bWHEREa.id = b.goods_idAND a.id = 5
执⾏结果如下
id有三种情况:
mysql语句的执行顺序1. id数字⼀样,则按从上往下的顺序执⾏
onblur会影响tab吗2. id的序号会递增,id值越⼤优先级越⾼,越先被执⾏
3. id相同⼜不同(1,2同时存在):id如果相同,可以认为是⼀组,从上往下顺序执⾏;在所有组中,id值越⼤,优先级越⾼,越先执⾏type字段详解
访问类型,sql查询优化中⼀个很重要的指标,结果值从好到坏依次是:system > const > eq_ref > ref > range > index > ALL
⼀般来说,好的sql查询⾄少达到range级别,最好能达到ref及以上
1、system:
表只有⼀⾏记录(等于系统表),这是const类型的特例,平时不会出现,可以忽略不计2、const:表⽰通过索引⼀次就到了,const⽤于⽐较primary key 或者 unique索引。因为只需匹配⼀⾏数据,所有很快。如果将主键置于where列表中,mysql就能将该查询转换为⼀个const
3、eq_ref:
唯⼀性索引扫描,对于每个索引键,表中只有⼀条记录与之匹配。常见于主键 或 唯⼀索引扫描。
4、ref:
⾮唯⼀性索引扫描,返回匹配某个单独值的所有⾏。
5、range:
只检索给定范围的⾏,使⽤⼀个索引来选择⾏。key列显⽰使⽤了那个索引。⼀般就是在where语句中出现了bettween、in等的查询。itoa函数头文件c
6、index:
index与ALL区别为index类型只遍历索引树。这通常为ALL块,应为索引⽂件通常⽐数据⽂件⼩。(Index与ALL虽然都是读全表,但index 是从索引中读取,⽽ALL是从硬盘读取)
7、ALL:
遍历全表以到匹配的⾏
possible_keys字段详解
查询涉及到的字段上存在索引,则该索引将被列出,但不⼀定被查询实际使⽤
key字段详解
实际使⽤的索引,如果为NULL,则没有使⽤索引。
Extra
不适合在其他字段中显⽰,但是⼗分重要的额外信息
1、Using filesort :
mysql对数据使⽤⼀个外部的索引排序,⽽不是按照表内的索引进⾏排序读取。也就是说mysql⽆法利⽤索引完成的排序操作成为“⽂件排序”
2、Using temporary:
什么是windows网络编程使⽤临时表保存中间结果,也就是说mysql在对查询结果排序时使⽤了临时表,常见于order by 和 group by
3、Using index:
表⽰相应的select操作中使⽤了覆盖索引(Covering Index),避免了访问表的数据⾏,效率⾼
如果同时出现Using where,表明索引被⽤来执⾏索引键值的查
如果没⽤同时出现Using where,表明索引⽤来读取数据⽽⾮执⾏查动作
覆盖索引(Covering Index):也叫索引覆盖。
就是select列表中的字段,只⽤从索引中就能获取,不必根据索引再次读取数据⽂件,
换句话说查询列要被所建的索引覆盖。
4、Using where :
使⽤了where过滤
5、Using join buffer :
使⽤了链接缓存
6、Impossible WHERE:
where⼦句的值总是false,不能⽤来获取任何数据如下
EXPLAIN SELECT brand_id,title FROM s_goods WHERE AND
where条件 AND 是不可能出现的,即为false执⾏结果如下
7、select tables optimized away:
在没有group by⼦句的情况下,基于索引优化MIN/MAX操作或者对于MyISAM存储引擎优化COUNT(*)操作,不必等到执⾏阶段在进⾏计算,查询执⾏计划⽣成的阶段即可完成优化,如下
EXPLAIN SELECT count(*) FROM s_goods
8、distinct:
杭州码农后悔了优化distinct操作,在到第⼀个匹配的元祖后即停⽌同样值得动作
使⽤慢查询分析(⾮常实⽤)
在my.ini中:
long_query_time=1
log-slow-queries=d:mysql5logsmysqlslow.log
把超过1秒的记录在慢查询⽇志中
MYISAM和INNODB的锁定
myisam中,注意是表锁来的。
⽐如在多个UPDATE操作后,再SELECT时,会发现SELECT操作被锁定了,必须等所有UPDATE操作完毕后,再能SELECT
innodb的话则不同了,⽤的是⾏锁,不存在上⾯问题。
MYSQL的事务配置项
innodb_flush_log_at_trx_commit=1
表⽰事务提交时⽴即把事务⽇志flush写⼊磁盘,同时数据和索引也更新,很费性能。innodb_flush_log_at_trx_commit=0
事务提交时,不⽴即把事务⽇志写⼊磁盘,每隔1秒写⼀次,MySQL挂了可能会丢失事务的数据。innodb_flush_log_at_trx_commit=2,
在整个操作系统 挂了时才可能丢数据,⼀般不会丢失超过1-2秒的更新。
php7进阶到架构师相关阅读
最后,欢迎⼤家留⾔补充,讨论~~~
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论