加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

教你如何定位及优化SQL语句的性能问题

发布时间:2018-10-14 08:12:52 所属栏目:编程 来源:Hollis
导读:【新品产上线啦】51CTO播客,随时随地,碎片化进修 在现现在的软件开拓中,相关型数据库是做数据存储最重要的器材。无论是Oracale照旧Mysql,都是必要通过SQL语句来和数据库举办交互的,这种交互我们凡是称之为CRUD。在CRUD操纵中,最最常用的也就是Read操

机能从好到差依次为:system,const,eq_ref,ref,fulltext,ref_or_null,unique_subquery,index_subquery,range,index_merge,index,ALL,除了ALL之外,其他的type都可以行使到索引,除了index_merge之外,其他的type只可以用到一个索引。

以是,假如通过执行打算发明某张表的查询语句的type表现为ALL,那就要思量添加索引,可能改换查询方法,行使索引举办查询。

possible_keys

也许行使的索引,留意不必然会行使。查询涉及到的字段上若存在索引,则该索引将被列出来。当该列为 NULL时就要思量当前的SQL是否必要优化了。

key

表现MySQL在查询中现实行使的索引,若没有行使索引,表现为NULL。

TIPS:查询中若行使了包围索引(包围索引:索引的数据包围了必要查询的全部数据),则该索引仅呈此刻key列表中。

select_type为index_merge时,这里也许呈现两个以上的索引,其他的select_type这里只会呈现一个。

key_length

索引长度char()、varchar()索引长度的计较公式:

  1. (Character Set:utf8mb4=4,utf8=3,gbk=2,latin1=1) * 列长度 + 1(应承null) + 2(变长列) 

其他范例索引长度的计较公式:ex:

  1. CREATE TABLE `student` ( 
  2.  `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
  3.  `name` varchar(128) NOT NULL DEFAULT '', 
  4.  `age` int(11), 
  5.  PRIMARY KEY (`id`), 
  6.  UNIQUE KEY `idx` (`name`), 
  7.  KEY `idx_age` (`age`) 
  8. ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4; 

name 索引长度为: 编码为utf8mb4,列长为128,不应承为NULL,字段范例为varchar(128)。key_length = 128 * 4 + 0 + 2 = 514;

教你怎样定位及优化SQL语句的机能题目

(https://juejin.im/post/5a52386d51882573443c852a)

age 索引长度:int范例占4位,应承null,索引长度为5。

教你怎样定位及优化SQL语句的机能题目

(https://juejin.im/post/5a52386d51882573443c852a)

ref

暗示上述表的毗连匹配前提,即哪些列或常量被用于查找索引列上的值

假如是行使的常数等值查询,这里会表现const,假如是毗连查询,被驱动表的执行打算这里会表现驱动表的关联字段,假如是前提行使了表达式可能函数,可能前提列产生了内部隐式转换,这里也许表现为func

rows

返回估算的功效集数量,留意这并不是一个精确值。

extra

extra的信息很是富厚,常见的有:

  • Using index 行使包围索引
  • Using where 行使了用where子句来过滤功效集
  • Using filesort 行使文件排序,行使非索引罗列办排序时呈现,很是耗损机能,只管优化。
  • Using temporary 行使了姑且表。

一些SQL优化提议 

1、SQL语句不要写的太伟大。

一个SQL语句要只管简朴,不要嵌套太多层。

2、行使『姑且表』缓存中间功效。

简化SQL语句的重要要领就是回收姑且表暂存中间功效,这样可以停止措施中多次扫描主表,也大大镌汰了阻塞,进步了并发机能。

3、行使like的时辰要留意是否会导致全表扫

有的时辰会必要举办一些恍惚查询好比

  1. select id from table where username like ‘%hollis%’ 

要害词%hollis%,因为hollis前面用到了“%”,因此该查询会行使全表扫描,除非须要,不然不要在要害词前加%,

4、只管停止行使!=或<>操纵符

在where语句中行使!=或<>,引擎将放弃行使索引而举办全表扫描。

5、只管停止行使 or 来毗连前提

在 where 子句中行使 or 来毗连前提,引擎将放弃行使索引而举办全表扫描。

可以行使

  1. select id from t where num=10union allselect id from t where num=20 

更换

  1. select id from t where num=10 or num=20 

6、只管停止行使in和not in

在 where 子句中行使 in和not in,引擎将放弃行使索引而举办全表扫描。

可以行使

  1. select id from t where num between 10 and 20 

更换

  1. select id from t where num in (10,20) 

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读