MySql查询优化性能调优,sql性能自测方法,及Mysql索引介绍

  • 前言
  • 一、普通优化加索引(适用于where条件后一个查询条件)
  • 二、组合查询加索引(适用于where条件后多个查询条件)
  • 三、Mysql索引类型 详解
    • 前言
      • 1.普通索引:
      • 2.唯一索引:
      • 3.主键索引:
      • 4.聚簇索引:
      • 5.全文索引:
  • 四、Expain(执行计划)详解
    • 前言
      • Expain出来的信息有10列:
      • 概要描述每个列:
      • 详情描述:
        • 1.id(详解):
        • 2.select_type(详解):
        • 3.table(详解):
        • 4.type(详解):
        • 5.possible_keys(详解):
        • 6.Key(详解):
        • 7.key_len(详解):
        • 8.ref(详解):
        • 9.rows(详解):
        • 10.Extra(详解):
  • 重要的事情说三遍,优化完一定要用Expain去看一下
  • 重要的事情说三遍,优化完一定要用Expain去看一下
  • 重要的事情说三遍,优化完一定要用Expain去看一下
  • 总结:仰天大笑出门去,我辈岂是蓬蒿人

前言

随着数据库数据的逐渐增加,某些查询条件的执行速度也会相对的越来越慢,因此需要通过加索引的方式来解决这种问题,下面介绍了索引的日常使用及介绍,还有sql自测神器Expain(执行计划)详细介绍,以下是项目实测,仅供参考。


一、普通优化加索引(适用于where条件后一个查询条件)


单表查询优化:表数据量大概100万优化原因:查询速度较为慢查询时长:查询花费4.7s左右Sql: SELECT DISTINCT monitor_time FROM monitor_data WHERE item_id = 'xxx';分析:item_id 是项目id,在项目多的情况下他会全盘扫描item_id为xxx的数据,由于数据量大,造成效率低解决方案:对查询条件的item_id加普通索引
ALTER TABLE monitor_data ADD INDEX ITEM_ID_INDEX (`item_id`) COMMENT “item_id索引”;
解决后:查询时间为0.019s索引介绍:
ALTER TABLE 表名 ADD INDEX 索引名 (`加索引的字段`) COMMENT “索引介绍”;

二、组合查询加索引(适用于where条件后多个查询条件)

数据量:数据量大概100万优化原因:查询速度慢查询时长:查询花费4.9s左右分析:全盘扫描多个条件,由于数据量大,造成效率低解决方案:加组合索引
ALTER TABLE monitor_data ADD INDEX RMU_INDEX ( `related_id`, `monitor_time`, `up_and_down`)  COMMENT '测项关联id+监测时间+上下行组合索引';解决后:查询时间为0.033ms,使用Expain看到添加索引前涉及的数据有33万条,添加索引后rows涉及的数据只有25条,还是非常明显

三、Mysql索引类型 详解

前言

简介:索引是查询优化最主要的方式;

查询方式有两种:
1:全表扫描;
2:利用数据表上建立的所以进行扫描。

如:对表中name字段建立索引;则按照表中name字段进行索引排序,并为其建立指向数据表中记录所在位置的“指针”。

Mysql索引根据用途分为:普通索引、唯一索引、主键索引、聚簇索引、全文索引

1.普通索引:

列值可以取空值或重复值。创建使用关键字INDEX或KEY;

2.唯一索引:

列值不能重复;即索引列值必须是唯一的,但可以是空值;创建使用关键字UNIQUE;

3.主键索引:

主键索引是系统自动创建的主键索引,并且是唯一的。与唯一索引区别是;列值不能为空;

4.聚簇索引:

就是数据存储的物理存储顺序,非聚簇索引就是索引顺序与数据的物理顺序无关。一个表只能有一个聚簇索引。目前只有InoDB和solidDB支持。

5.全文索引:

只能创建在varchar或text的列上;建立全文索引能够在全文索引的列上进行查找。
(1)单列索引:就是一个索引只包含表中的一个列;比如创建一个学号ID的索引,以name再创建一个姓名的单列索引,即每个索引包含一个列。
(2)组合索引(复合索引或多列索引):就是表中的两个列或多个列来创建成一个索引;
比如;以用户ID、用户名Name、用户年龄Age来创建的索引就是联合索引。
排序规则是;左前缀原则:即先按照用户ID,排序后;当第一列值相同的情况下;则按照用户名Name第二列判刑;依次类推。

四、Expain(执行计划)详解

前言

在日常工作中,我们会找出一些执行特别慢的sql,需要对这些sql进行查询优化,这时我们会用到Expain这个命令来查看一个这些sql语句的执行计划,查看该SQL语句有没有使用上了索引,有没有做全表扫描,这都可以通过explain命令来查看。所以当我们深入了解MySQL的基于开销的优化器,还可以获得很多可能被优化器考虑到的访问策略的细节,以及当行SQL语句时哪种策略预计会被优化器采用。

Expain出来的信息有10列:

id、select_type、table、type、possible_keys、key、key_len、ref、rows、Extra

概要描述每个列:

针对每个列的介绍概要描述:
id:选择标识符;
select_type:表示查询的类型;
table:输出结果集的表;
partitions:匹配的分区;
type:表示表的连接类型;
possible_keys:表示查询时,可能使用的索引;
key:表示实际使用的索引;
key_len:索引字段的长度;
ref:列与索引的比较;
rows:扫描出的行数(估算的行数);
filtered:按表条件过滤的行百分比;
Extra:执行情况的描述和说明。

详情描述:

1.id(详解):

SELECT识别符。这是SELECT的查询序列号(ps:我的理解这个应该是你写那个SQL执行的顺序标识,SQL执行顺序根据id从大的到小执行)
1.id相同时,执行顺序由上至下。
2.如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行。
3. id如果相同,可以认为是一组,从上往下顺序执行;在所有组中,id值越大,优先级越高,越先执行。

2.select_type(详解):

type值包括:SIMPLE、PRIMARY、UNION、DEPENDENT UNION、UNION RESULT、SUBQUERY、DEPENDENT SUBQUERY、DERIVED、UNCACHEABLE SUBQUERY

  1. SIMPLE:单表sql,简单的SELECT,不使用UNION或者子查询。
  2. PRIMARY:子查询中最外层查询,查询中若包含任何复杂的子部分,最外层的select就会被标记为PRIMARY,最外层SELECT。
  3. UNION:关联查询的第二层,在SELECT之后使用了UNION。
  4. DEPENDENT UNION(UNION中的第二个或后面的SELECT语句,取决于外面的查询)。
  5. UNION RESULT(UNION的结果,union语句中第二个select开始后面所有select)。
  6. SUBQUERY(子查询中的第一个SELECT,结果不依赖于外部查询)。
  7. DEPENDENT SUBQUERY(子查询中的第一个SELECT,依赖于外部查询)。
  8. DERIVED(派生表的SELECT, FROM子句的子查询)。
  9. UNCACHEABLE SUBQUERY(一个子查询的结果不能被缓存,必须重新评估外链接的第一行)。

3.table(详解):

显示这一步所访问数据库中表名称(表示这一行的数据是关于哪张表的),有时不是真实的表名字,可能是简称,例如select * from user_table a 可能你看到的就是a,也可能是第几步执行的结果的简称

4.type(详解):

对表访问方式,表示MySQL在表中找到所需行的方式,又称“访问类型”。
常用的类型有: ALL、index、range、 ref、eq_ref、const、system、NULL(从左到右,性能从差到好)

1.ALL:Full Table Scan(全表扫描), MySQL将遍历全表以找到匹配的行
2. index: Full Index Scan(全索引扫描),index与ALL区别为index类型只遍历索引树
3. range:只检索给定范围的行,使用一个索引来选择行
4. ref: 表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值
5. eq_ref: 类似ref,区别就在使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配,简单来说,就是多表连接中使用primary key或者unique key作为关联条件
6. const、system: 当MySQL对查询某部分进行优化,并转换为一个常量时,使用这些类型访问。如将主键置于where列表中,MySQL就能将该查询转换为一个常量,system是const类型的特例,当查询的表只有一行的情况下,使用system
7. NULL: MySQL在优化过程中分解语句,执行时甚至不用访问表或索引,例如从一个索引列里选取最小值可以通过单独索引查找完成。

5.possible_keys(详解):

指出MySQL能使用哪个索引在表中找到记录,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用(该查询可以利用的索引,如果没有任何索引显示 null)
该列完全独立于EXPLAIN输出所示的表的次序。这意味着在possible_keys中的某些键实际上不能按生成的表次序使用。如果该列是NULL,则没有相关的索引。在这种情况下,可以通过检查WHERE子句看是否它引用某些列或适合索引的列来提高你的查询性能。如果是这样,创造一个适当的索引并且再次用EXPLAIN检查查询

6.Key(详解):

key列显示MySQL实际决定使用的键(索引),必然包含在possible_keys中,如果没有选择索引,值为NULL。要想强制MySQL使用或忽视possible_keys列中的索引,在查询中使用FORCE INDEX(强行使用索引)USE INDEX(使用这个索引)或者IGNORE INDEX(忽略这个索引)。

7.key_len(详解):

表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度(key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的)
不损失精确性的情况下,长度越短越好

8.ref(详解):

列与索引的比较,表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值

9.rows(详解):

估算出结果集行数,表示MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数

10.Extra(详解):

该列包含MySQL解决查询的详细信息,有以下几种情况:
1.Using where:不用读取表中所有信息,仅通过索引就可以获取所需数据,这发生在对表的全部的请求列都是同一个索引的部分的时候,表示mysql服务器将在存储引擎检索行后再进行过滤
2.Using temporary:表示MySQL需要使用临时表来存储结果集,常见于排序和分组查询,常见 group by ; order by
3.Using filesort:当Query中包含 order by 操作,而且无法利用索引完成的排序操作称为“文件排序”
4.Using join buffer:改值强调了在获取连接条件时没有使用索引,并且需要连接缓冲区来存储中间结果;如果出现了这个值,那应该注意,根据查询的具体情况可能需要添加索引来改进能。
5.Impossible where:这个值强调了where语句会导致没有符合条件的行(通过收集统计信息不可能存在结果)。
6.Select tables optimized away:这个值意味着仅通过使用索引,优化器可能仅从聚合函数结果中返回一行
7.No tables used:Query语句中使用from dual 或不含任何from子句
8.Backward index scan; Using index 使用反向索引扫描;


重要的事情说三遍,优化完一定要用Expain去看一下

重要的事情说三遍,优化完一定要用Expain去看一下

重要的事情说三遍,优化完一定要用Expain去看一下

总结:仰天大笑出门去,我辈岂是蓬蒿人

MySql查询优化性能调优,sql性能自测方法,及Mysql索引介绍相关推荐

  1. MySQL性能调优与架构设计——第4章 MySQL安全管理

    第4章 MySQL安全管理 前言 对于任何一个企业来说,其数据库系统中所保存数据的安全性无疑是非常重要的,尤其是公司的有些商业数据,可能数据就是公司的根本,失去了数据的安全性,可能就是失去了公司的一切 ...

  2. java 性能调优_Java性能调优调查结果(第四部分)

    java 性能调优 这是本系列中的最后一篇文章,我们将分析我们在2014年10月进行的Java Performance Tuning Survey的结果.如果您尚未阅读第一篇文章,建议您首先阅读以下内 ...

  3. java 性能调优_Java性能调优调查结果(第三部分)

    java 性能调优 这是本系列文章的第三篇,我们将分析2014年10月进行的调查的结果.如果您尚未这样做,我建议从本系列的前两篇文章开始: 问题严重性分析和监视域分析 . 这篇文章着重于故障排除/根本 ...

  4. java 性能调优_Java性能调优调查结果(第二部分)

    java 性能调优 这是系列文章的第二篇,我们将分析2014年10月进行的性能调整调查的结果.如果您尚未阅读第一部分,我们建议从此处开始 . 第二部分将重点监视Java应用程序的性能问题. 特别是,我 ...

  5. java 性能调优_Java性能调优调查结果(第一部分)

    java 性能调优 我们在2014年10月进行了Java性能调优调查.该调查的主要目的是收集对Java性能世界的见解,以改善Plumbr产品. 但是,我们也很高兴与您分享有趣的结果. 我们收集的数据为 ...

  6. python 性能优化监控工具_推荐一款非常实用的JVM性能调优监控工具(亲测好用)...

    前言 现实企业级Java开发中,有时候我们会碰到下面这些问题: 1.OutOfMemoryError,内存不足 2.内存泄露 3.线程死锁 4.锁争用(Lock Contention) 5.Java进 ...

  7. MySQL查询优化与调优

    概述 数据库调优的方式有多种: 建立索引.充分利用到索引.不让索引失效 对SQL语句进行优化 调优如缓冲.线程数等参数 数据过多时,分库分表 大方向上可以分为物理查询优化和逻辑查询优化两块. 物理查询 ...

  8. 记一次PHP并发性能调优实战 -- 性能提升104%

    作者: 万千钧(祝星) 适合阅读人群 文中的调优思路无论是php, java, 还是其他任何语言都是用. 如果你有php使用经验, 那肯定就更好了 业务背景 框架及相应环境 laravel5.7, m ...

  9. 性能调优-SQL TRACE

    一 SQL TRACE 使用方法: 1.初始化sql trace    参数:       timed_statistics=true 允许sql trace 和其他的一些动态性能视图收集与时间有关的 ...

  10. MYSQL性能调优及架构设计学习笔记-影响MYSQL性能的相关因素之实例分析

    为什么80%的码农都做不了架构师?>>>    需求概述 一个简单的讨论区系统,需要有用户,用户组,组讨论区这三部分基本功能 简要分析 1) 须要存放用户数据的表: 2) 须要存放分 ...

最新文章

  1. deprecated pixel format used, make sure you did set range correctly
  2. gamma分布python代码_Python sympy.stats.NormalGamma()用法及代码示例
  3. 2-1 什么是人工智能|人工智能框架TensorFlow应用实践
  4. JavaScript学习杂记--对象和数组
  5. java 一些容易忽视的小点-控制语句
  6. 2021高值人才职业发展洞察:连接、信任与赋能
  7. 标定小觅相机MYNT-EYE-S2110使用kalibr标定
  8. 2022年IT热门能力
  9. vue项目中vue-router的使用
  10. React 使用图片验证码组件(登录验证)
  11. Paint的方法总结(一):基本常用Api
  12. nginx基于tcp负载均衡
  13. OCR图像识别与汽车后市场
  14. 掌握这些,你也可以轻松扒谱(上)
  15. Firebug工具的介绍与安装
  16. 作为一个大学才开始入门学计算机编程的孩子想要的东西-----听我扯,你蛋疼,他菊紧,我开心...
  17. android实现箭头流程列表_Android弹出选项框及指示箭头动画选择
  18. sinkhorn algorithm
  19. 用好HugePage,告别Linux性能故障
  20. 谷歌浏览器的timeline工具的使用

热门文章

  1. 算力网络 — 核心技术
  2. QC Camera 3A\ISP 常见缩写记录
  3. 【JAVA】8.继承(图形面积问题)
  4. 云宏刘建平:细说中小企业如何上云
  5. 盘古开源解析:物联网时代的芯片产业新趋势
  6. mysql数据库DBA题型问题解答
  7. isbn书号查询php代码,php根据isbn书号查询amazon网站上的图书信息的示例_PHP教程
  8. excel综合应用(一):信息查询
  9. 算法竞赛入门【码蹄集进阶塔335题】(MT2076-2100)
  10. 手机天猫将全面升级,成为天猫新零售入口丨对话天猫总裁靖捷