| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> 【四】慢sql+索引与执行计划 -> 正文阅读 |
|
[大数据]【四】慢sql+索引与执行计划 |
目录 慢查询什么是慢查询慢查询日志,就是查询慢的日志,指mysql记录所有执行超过long_query_time参数设定的时间阈值的sql语句的日志。该日志能为sql语句的优化带来很好的帮助。默认情况下,慢查询日志是关闭的,要使用慢查询日志功能,需要先开启。 慢查询配置慢查询基本配置 slow_query_log 启动停止慢查询日志 slow_query_log_file 指定慢查询日志的存储路劲及文件(默认和数据文件放一起) long_query_time 指定记录慢查询日志sql执行事件的阈值(单位:秒,默认120秒) log_queries_not_using_indexs 是否记录未使用索引的sql log_output 日志存放的地方 【TABLE】【FILE】【FILE,TABLE】 记录符合条件的sql 查询语句 数据修改语句 已经回滚的sql 启动慢查询: set global slow_query_log = 1 set global slow_query_time = 0 show variables like '%slow_query_log%' 慢查询解读 慢查询分析mysqldumpslow 这个工具必须登录到mysql服务器才能访问 ?pt_query_digest ? ? 索引索引是帮助mysql高效获取数据的数据结构 本质:索引是数据结构 索引的分类:普通索引:即一个索引只包含单个列,一个表可以有多个单列索引 唯一索引:索引列的值必须唯一,但允许有空值 复合索引:即一个索引包含多个列 聚簇索引(聚集索引):并不是一种单独的索引类型,而是一种数据存储方式。具体细节取决于不用的实现,innodb的聚簇索引其实就是在同一个结构中保存了B-Tree索引(技术上来说是B+Tree)和数据行 非聚簇索引:不是聚簇索引,就是非聚簇索引 show global variables like '%datadir%' mysql默认存储引擎innodb只显示支持B-Tree(从技术上来说是B+Tree)索引 面试问题: B-Tree、B+Tree、二叉树有什么区别 基础语法:查看索引 show index from table_name 创建索引 create [unique] index indexName on mytable(columnName(length)) alter table 表名 add [unique] index [indexName] on (columnname(length)) 删除索引 drop index [indexName] on mytable 执行计划执行计划是什么:????????使用explain 关键字可以模拟优化器执行sql查询语句,从而知道mysql是如何处理你的sql语句的,分析你的查询语句或者表结构的性能瓶颈 ????????语法: ????????explain + sql语句 执行计划的作用:????????表的读取顺序 ????????数据读取操作的操作类型 ????????哪些索引可以使用 ????????哪些索引被实际使用 ????????表之间的引用 ????????每张表有多少行被优化器查询 执行计划说明
获取select子句的操作表顺序 执行计划——idid相同的情况: 如果id相同,从上往下顺序执行 id不同的情况: 如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行; id相同又不同的情况: 如果id相同,可以认为是一组,从上往下顺序执行,在所有组中,id值越大,优先级越高,越先执行; 执行计划——select_type查询的类型,主要是用于区别 普通查询、联合查询、子查询等复杂查询 有哪些类型: SIMPLE、PRIMARY、SUBQUERY、DERVIED、UNION、UNION RESULT SIMPLE:explain select * from table_a; PRIMARY: 执行计划——table显示这一行数据是关于哪张表的 执行计划——typetype显示的是访问类型,是较为重要的一个指标,结果值从最好到最坏依次是: system > const > eq_refref > fulltext > ref_or_null index_merge > unique_subquery > index_subquery > range > index > ALL 需要记忆的 system>const>eq_ref>ref>range>index>ALL system: 表只有一行记录(等于系统表),这是const类型的特例,平时不会出现,这个可以忽略不计 const: 表示通过索引一次就找到了 const用于比较primary key或者unique索引。因为只匹配一行数据,所以很快,如果将主键置于where列表中,mysql就能将该查询转换为一个常量 ref: 非唯一性索引扫描,返回匹配某个单独只的所有行 本质上也是一种索引访问,它返回所有匹配某个单独值的行,然而,它可能会找到多个符合条件的行,所以它应该属于查找和扫描的混合体 rang: 值检索给定范围内的行,使用一个索引来选择行。key列显示使用了哪个索引。一般就是在你的where语句中出现between、<、>、in等的查询,这种范围扫描索引比全表扫描要好,因为只需要开始于索引的某一点,而结束于另一点。 index: 当查询结果全为索引列的时候,也是全表扫描的一种,仅仅比全表扫描性能好。会扫描整个索引文件,只是不去扫描真实的数据文件 执行计划——key实际使用的索引,如果为null则没有使用索引 查询中若使用了覆盖索引,则该索引和查询的select字段重叠 执行计划——key_len表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度。在不损失精确性的情况下,长度越短越好 key_len现实的额是值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的。 key_len表示索引使用的字节数 根据这个值可以判断索引使用情况,特别是组合索引的时候,判断所有的索引字段是否都被查询用到。 char和varchar跟字符编码也有密切的关系 总结: 变长字段需要额外的2个字节,varchar值保存时只保存需要的字符数,另加1个字节来记录长度(如果列声明的长度超过255,则使用2个字节),所以varchar所以你长度计算时候要+2,固定长度字段不需要额外的字节。 而null都需要1个字节的额外空间,所以索引字段最好不要为null,因为null让统计更加复杂并且需要额外的存储空间。 latin1只能用1个字节,gbk占用2个字节,utf8占用3个字节。(不同字符编码占用的存储空间不同) NOT NULL = 字段本身的字段长度 NULL = 字段本身的字段长度+1(因为需要有是佛偶为空的标记,这个标记需要占用1个字节) 复合索引有最左缀的特性,如果符合索引能全部用上,则是复合索引长度之和,这也可以用来判定复合索引是否部分使用,还是全部使用 执行计划-ref显示索引的哪一列被使用了,如果可能的话,是一个常数。哪些列或常量被用于查找索引列上的值。 执行计划——rows根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数 执行计划——Extra包含不适合在其他列中显示,但十分重要的额外信息 作业: MySQL中myisam与innodb的区别? redo和undo干什么用的? hash索引是什么,什么存储引擎支持?有什么优缺点? btree和b+tree有什么样的区别,对于范围检索来说,b+tree好在哪里? 全文索引是怎么回事? M小ySQL中InnoDB支持的四种事务隔离级别是什么?有什么区别 MYSQL中的间隙锁是怎么回事,有几种方式产生间隙锁? 能谈谈ysql实现读写分离的原理吗,和存储引擎有什么关系? |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 10:06:06- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |