目录
慢查询
什么是慢查询
慢查询日志,就是查询慢的日志,指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语句
执行计划的作用:
表的读取顺序
数据读取操作的操作类型
哪些索引可以使用
哪些索引被实际使用
表之间的引用
每张表有多少行被优化器查询
执行计划说明
id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
获取select子句的操作表顺序
执行计划——id
id相同的情况:
如果id相同,从上往下顺序执行
id不同的情况:
如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行;
id相同又不同的情况:
如果id相同,可以认为是一组,从上往下顺序执行,在所有组中,id值越大,优先级越高,越先执行;
执行计划——select_type
查询的类型,主要是用于区别 普通查询、联合查询、子查询等复杂查询
有哪些类型:
SIMPLE、PRIMARY、SUBQUERY、DERVIED、UNION、UNION RESULT
SIMPLE:explain select * from table_a;
PRIMARY:
执行计划——table
显示这一行数据是关于哪张表的
执行计划——type
type显示的是访问类型,是较为重要的一个指标,结果值从最好到最坏依次是:
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实现读写分离的原理吗,和存储引擎有什么关系?