mysql临时关闭索引功能_MySQL优化之索引优化

$1.WHY : 找到MySQL Query执行慢的原因

1.1 EXPLAIN

通过Explain查看SQL Query语句的执行情况,从中找出导致MySQL查询性能差的原因EXPLAIN + QUERY语句

90faa93350af6a5948930ee49c71f7a2.png

【字段解释】

<1> id -- 表的读取顺序id相同时,按照从上至下的顺序执行

id不同时,id值越大,则执行优先级越高,执行顺序越靠前

<2> select_type -- 数据读取操作的操作类型SIMPLE:简单的select查询,不包含子查询或者UNION操作

PRIMARY:若查询中包含复杂的子部分,如子查询,则最外层的查询则被标记为PRIMARY,最后执行

SUBQUERY:在SELECT或者WHERE语句中包含了子查询

DERIVED:在FROM语句中包含的子查询则会被标记为DERIVED(即衍生表),其结果会被存放在临时表中

UNION:若第二个SELECT语句出现在UNION后面,则被标记为UNION;若UNION出现在FROM语句中的子查询中,则外层SELECT语句会被标记为DERIVED

UNION RESULT:从UNION表获取结果的SELECT

<3> table -- 显示当前执行计划是针对哪张表

<4> type -- 访问类型system:表中只有一行记录,等价于系统表, 这是const类型的特例,实际生产中基本不会出现

const:只通过一次索引就能找到,只匹配一条记录,const用于比较primary key或者unique索引。

eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一键扫描

ref:非唯一性索引扫描,返回匹配某个单独值的所有行。本质上也是索引访问,它可能找到多个符合条件的行,因此属于查找和扫描的混合体

range:只检索给定范围的行,使用一个索引来选择行,key键显示使用了哪个索引。一般出现在where语句中包含between、、in等查询,比全表扫描要好,因为他相当于全表索引的子集,不需要扫描所有

index:Full Index Scan,index类型遍历全表索引树,而ALL类型要遍历全部表的数据,因此Index类型一般要比ALL更快,因为索引数据量一般小于实际表的数据量

ALL:扫描全表的行匹配到需要的记录

一般来说,尽量能够优化到ref或者range

<5> possible keys -- 显示可能应用在这张表中的索引,但不一定被实际查询使用

<6> key -- 实际使用的索引NULL:表示当前查询没有用到索引(可优化点)

查询中如果使用了覆盖索引,则该索引仅出现在key字段中

<7> key_len

表示索引中使用的字节数,可通过该列就按查询中使用的索引长度,在不损失精度前提下,长度越短越好。注意:key_len显示的值为索引字段最大可能长度,并非实际使用长度

<8> ref

显示索引的哪一列被使用了,如果是等值判断的话,该字段也可能是一个常数(const),显示哪些列或常量被用于查找索引列上的值

<9> rows

根据表统计信息即索引选用情况,大致估算出找到所需记录所需要读取的行数

<10> Extra -- 包含不在其他列中显示却又重要的额外信息Using filesort:MySQL会对数据进行一个外部的索引排序,而不是按照表中的索引进行排序。这种无法利用索引完成的排序操作成为"文件排序",实际中应该尽量避免,出现了需要及时优化

Using temporary:使用了临时表保存中间结果,MySQL在对查询结果排序时使用了临时表,常见于排序操作 order by 和分组操作 group by ---- 必须避免该情况!!会严重影响MySQL性能

Using index:表明select操作使用了覆盖索引,避免了全表扫描 ;如果同时出现了Using where,表明索引被用来执行索引键值的查找;如果没有同时出现Using where,表明索引用来读取数据而非执行查找

Using where:见上

Using join buffer:使用了表的连接缓存

impossible where:where子句的值总是false,不能实际获取记录

select tables optimized away:在没有group by子句的情况下,基于索引优化MIN/MAX操作或者对于存储引擎MyISAM优化COUNT(*)操作,不必等到执行阶段再进行计算,查询执行计划生成的计算即完成优化

distinct:优化distinct操作,在找到第一匹配的元组之后即立即停止找同样值的动作

1.2 SLOW_QUERY_LOG(慢查询日志)

慢查询日志功能开启后,MySQL会自动收集那些执行时间超过设置阈值的QUERY语句,优化人员便能够通过查看日志系统地分析影响MySQL性能的因素。默认MySQL是关闭慢查询日志功能的,因为开启此功能会增加判断和日志收集操作,或多或少会影响MySQL性能## 开启慢查询日志功能,只对当前服务有效,即MySQL服务器重启后失效

set global slow_query_log=1

## 查看慢查询日志的判断阈值参数long_query_time,默认为10s

show variables like '%long_query_time%';

## 设置阈值为3s,需要重新连接客户端才能生效

set global long_query_time=3;

## 查看当前系统中有多少条慢查询日志记录,可判断系统性能状态

show global status like '%Slow_queries%';

PLUS:慢查询日志官方分析工具 -- mysqldumpslow

1.3 SHOW PROFILE

与慢查询日志一样,MySQL也是默认关闭SHOW PROFILE功能,需要设置参数手动打开## 开启SHOW PROFILE功能

show variables like "profiling";

set profiling=on;## 查询记录的所有Query指令及其各环节的执行时间

show profiles;

0d6b66457f66a53d57a33d302d151006.png##对某条查询指令单独进行深度分析,可以查询Query指令的整个生命周期每个环节的运行时间和开销,针对性地进行分析优化

show profile cpu, block io for query 10;

其中,可以查询的item有:

07c8d506810624b501231ec203d77305.png

WARNING: 四个主要比较拖慢性能的项,查询结果中如果有任意一个,则需要尽可能优化converting HEAP to MyISAM:查询结果太大,内存不够,需要写到磁盘上

Creating tmp table:创建了临时表,即会将数据拷贝到临时表,用完再删除

Copying to tmp table on disk:把内存中的临时表复制到磁盘上,非常危险

locked

1.4 GENERAL_LOG

该功能一般只在测试环境中启用,会收集全局的查询日志,即每一条查询语句都会被记录。实际开发生产环境中一般不要启用set global general_log=1;     ## 开启全局日志功能

set global log_output='TABLE';   ## 设置日志输出为表的格式

select * from mysql.general_log;   ## 查询日志记录

$2.HOW:如何优化

2.1 表的Join

<1> 多表Join情况

两表情况:驱动表一方全部保存,因此相当于在被驱动表中查询数据左连接 LEFT JOIN -- 右表外键建索引

右连接 RIGHT JOIN -- 左表外键建索引

多表情况:优先用小表驱动大表保证Join语句中被驱动表的Join条件字段已经建立索引

当无法保证被驱动表join条件字段被索引情况下,如果内存资源充足,可以启用更大的JoinBuffer

2.2 避免索引失效尽量保证全值匹配,即索引字段和select字段相同且顺序一致

最佳左前缀法则:如果索引多列,则查询要从索引的最左列开始,且中间不跳过索引中的列## 建立联合索引 a_b_c

## 不走索引:WHERE b AND c 、 WHERE c

## 走部分索引:WHERE a AND c、WHERE a AND b

## 走全部索引:WHERE a AND b AND c不在索引列上做任何操作(计算、函数、类型转换、特别注意!注意!注意!不要出现隐式转换),会导致索引失效而全表扫描## 假设目标行 name = 'july'

select * from info where name='july'; ## 走索引

select * from info where left(name,4)='july';   ## 不走索引一旦出现非等值字段条件判断,则该字段后的索引列皆失效select * from info where a=10 and b=100 and c=1000;   ## 全索引 a_b_c

select * from info where a=10 and b>100 and c=1000;   ## 部分索引 a_b

## 非等值条件包括:in < > != like 等

## 注意:当like 'aaa%' 通配符在右时,仍然能够走全索引

select * from info where a=10 and b like '100%' and c=1000;   ## 全索引 a_b_c

select * from info where a=10 and b like '%100' and c=1000;   ## 部分索引 a尽量使用覆盖索引,即查询列为索引列的子集,减少select * 的使用

MySQL在使用不等于(!=或者<>)时无法使用索引,会导致全表扫描select * from info where a=100;   ## 走索引

select * from info where a!=100; ## 不走索引,全表扫描查询条件为 is NULL 和 is not NULL情况时也无法使用索引select * from info where a is null; ## 不走索引

select * from info where a is not null; ## 不走索引like以通配符开头('%abc...')时索引也会失效,变为全表扫描;但通配符结尾依然会走索引,但该字段后的索引依然失效select name, age from info where name like "%aaa";  ## 索引失效

select name, age from info where name like "aaa%";  ## 索引有效

## 当业务要求必须使用左通配符时,可使用覆盖索引的方法来避免索引失效

## 在上面例子中即建立联合索引 name_age字符串不加单引号会导致索引失效 -- 原因:隐式转换## id为varchar类型

select * from info where id='2000';

select * from info where id=2000; ## 会有隐式类型转换尽量少用or,用它来连接查询条件可能会导致索引失效

group by基本上都需要进行排序,当group by的字段顺序和索引顺序不一致的时候,就会导致临时表的产生,即同时出现 Using temporary 和 Using filesort,因此一定要极力避免## 索引为 A_B_C

select * from info where A=10 group by C, B; ## 走索引A,产生临时表

2.3 索引优化小结对于单值索引,尽量选择针对当前查询过滤性更好的索引字段

在选择联合索引时,当前查询中过滤性最好的字段在索引字段顺序中位置越靠前越好

在选择联合索引时,尽可能选择可以包含当前查询的where子句中更多字段的索引,即如果可能的话,尽量达到索引覆盖,这样不仅能够避免索引失效,也能够避免回表等影响查询性能等操作

尽可能通过分析统计信息和调整查询语句的写法来达到适应选择的索引

REFERENCR

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/395955.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

K8S Calico

NetworkPolicy是kubernetes对pod的隔离手段&#xff0c;是宿主机上的一系列iptables规则。 Egress 表示出站流量&#xff0c;就是pod作为客户端访问外部服务&#xff0c;pod地址作为源地址。策略可以定义目标地址或者目的端口 Ingress 表示入站流量&#xff0c;pod地址和服务作…

每周总结(第十一周)

转载于:https://www.cnblogs.com/qinlihong/p/5510026.html

10个关于linux中Squid代理服务器的实用面试问答

10个关于linux中Squid代理服务器的实用面试问答 不仅是系统管理员和网络管理员时不时会听到“代理服务器”这个词&#xff0c;我们也经常听到。代理服务器已经成为一种企业常态&#xff0c;而且经常会接触到它。它现在也出现在一些小型的学校或者大型跨国公司的自助餐厅里。Squ…

北京矿大计算机考研每年分数线,2021中国矿业大学北京考研国家线公布时间_国家线是多少分...

中国矿业大学北京考研国家线怎么看&#xff1f;中国矿业大学北京考研国家线是多少分&#xff1f;山西人事考试网整理中国矿业大学北京考研考研国家线怎么看、国家线公布时间、历年中国矿业大学北京考研国家线&#xff0c;希望考生及时关注考研成绩国家线公布信息&#xff0c;为…

工厂模式-依赖倒置原则

老板&#xff1a;阿飞啊&#xff0c;我们公司最近接了个项目&#xff0c;你看着设计一下&#xff0c;我给你说下需求。项目组长阿飞&#xff1a;好啊&#xff0c;什么需求&#xff1f;老板&#xff1a;我们找了一个合作的商铺&#xff0c;他们要设计一套面包销售系统。主要功能…

(6)css盒子模型(基础下)

一、理解多个盒子模型之间的相互关系 现在大部分的网页都是很复杂的&#xff0c;原因是一个“给人用的”网页中是可能存在着大量的盒子&#xff0c;并且它们以各种关系相互影响着。 html与DOM的关系 详情了解“DOM” &#xff1a;http://baike.baidu.com/link?urlSeSj8sRDE-JZ…

easyui获取下拉框选中的文本值_Word中文本显示不全的常见3种情况及解决方法

在日常工作使用Word文档时&#xff0c;经常会遇到文本显示不全的情况&#xff0c;比如文本框或表格里的文本显示不全等情况&#xff0c;你一般是怎么操作呢&#xff1f;以下这3种常见情况你可能也遇到过&#xff0c;一起看看是什么原因并解决它们吧&#xff01;1、文本显示不全…

CSS中属性的值和单位

CSS中值的单位 1.颜色值 被各种浏览器支持&#xff0c;并且作为 CSS 规范推荐的颜色名称只有 16 种&#xff0c;如下表所示。 百分比表示 color: rgb(100%, 100%, 100%); 这个声明将红、蓝、绿 3 种原色都设置为最大值&#xff0c;结果组合显示为白色。相反&#xff0c;可以设置…

《走进SAP(第2版)》——2.8 SAP的目标是什么

本节书摘来自异步社区《走进SAP&#xff08;第2版&#xff09;》一书中的第2章&#xff0c;第2.8节,作者&#xff1a; 【德】Nancy Muir , Ian Kimbell , 等 更多章节内容可以访问云栖社区“异步社区”公众号查看。 2.8 SAP的目标是什么 走进SAP&#xff08;第2版&#xff09;…

8 包含min函数的栈

0 引言 题目&#xff1a;定义栈的数据结构&#xff0c;请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中&#xff0c;调用min、push及pop的时间复杂度都是O&#xff08;1&#xff09;. 1 抽象问题具体化 2 具体问题抽象分析 需要解决的两个主要问题如下。 &#x…

《Adobe Illustrator大师班:经典作品与完美技巧赏析》—Svetlana Makarova

本节书摘来自异步社区《Adobe Illustrator大师班&#xff1a;经典作品与完美技巧赏析》一书中的Svetlana Makarova&#xff0c;作者【英】Sharon Milne,更多章节内容可以访问云栖社区“异步社区”公众号查看。 Svetlana MakarovaAdobe Illustrator大师班&#xff1a;经典作品与…

有关软件测试的证书,软件测试证书有用吗

要想知道证书有什么用&#xff0c;我们就要详细了解软件评测师考试&#xff0c;以及拿到证书的价值。那么下面和小编来看看这篇软件测试证书有用吗&#xff0c;一定会有收获。一、证书考试软件评测师考试是全国计算机技术与软件技术资格考试的一个中级考试。考试不规定学历和资…

python D29 socketserver以及FTB

一、socketserver 基于tcp协议下的socket只能和一个客户端通信&#xff0c;如果用socketserver可以实现和多个客户端通信。 他是在socket的基础上进行封装&#xff0c;也就是说底层还是调用的socket&#xff0c;在py2.7里面叫做SocketServer也就是大写了两个S&#xff0c;在py3…

sphinx mysql存储引擎_基于Sphinx+MySQL的千万级数据全文检索(搜索引擎)架构设计...

Sphinx&#xff0c;单一索引最大可包含1亿条记录&#xff0c;在1千万条记录情况下的查询速度为0.x秒(毫秒级)。Sphinx创建索引的速度为&#xff1a;创建100万条记录的索引只需3&#xff5e;4分钟&#xff0c;创建1000万条记录的索引可以在50分钟内完成&#xff0c;而只包含最新…

4-1 线程安全性-原子性-atomic-1

转载于:https://www.cnblogs.com/ZHONGZHENHUA/p/10026627.html

delphi7 提示注册过期问题

很同情你得经过~ 因为我以前也是经常遇见这个问题~就和你说得一样~ 后来~ 我发现 下载使用的Delphi 7只能使用一个注册码&#xff0c;那就是:6AMD-PKG68E-DB8PP7-9SFE 3QH-9QW所以,你先把C:\Documents and Settings\Administrator\.borland文件夹下的两个文件删除然后用 Progra…

计算机开机引导的结果是,电脑开机显示引导媒体是怎么回事

电脑开机显示引导媒体是怎么回事分类&#xff1a;数据恢复常见问题|最后更新&#xff1a;2020年4月9日开机显示重新启动并选择适当的引导设备或插入1.如果主机上接有可移动存储介质(如光盘、移动硬盘、U盘等),将其拔掉,然后重启。2.如果仍然这样,进入主板设置中,依次检测以下几…

mysql怎样修改my ini_mysql修改my.ini报错怎么办

mysql修改my.ini报错的解决办法&#xff1a;首先将mysql默认编码改成utf8mb4&#xff0c;并修改【my.ini】配置&#xff1b;然后修改变量&#xff0c;并检查是否设置成功即可。更多相关免费学习推荐&#xff1a;mysql教程(视频)mysql修改my.ini报错的解决办法&#xff1a;将mys…

spring-DataSource

spring支持的dataSource有好多&#xff0c; 如&#xff1a;自带的org.springframework.jdbc.datasource.DriverManagerDataSource ibatis、c3p0、JDBC、hibernate等等&#xff1b; 首先看第一种&#xff0c;使用自带的datasource&#xff1a; 1、项目结构 提示&#xff1a;spri…

《Nmap渗透测试指南》—第7章7.8节后台打印机服务漏洞

本节书摘来自异步社区《Nmap渗透测试指南》一书中的第7章7.8节后台打印机服务漏洞&#xff0c;作者 商广明,更多章节内容可以访问云栖社区“异步社区”公众号查看。 7.8 后台打印机服务漏洞表7.8所示为本章节所需Nmap命令表&#xff0c;表中加粗命令为本小节所需命令——后台打…