慢查询
慢查询配置
MySQL记录所有执行超过long_query_time参数设定实际阈值的SQL语句日志
常用命令
SHOW VARIABLES like 'slow_query_log';--是否开启慢日志
SHOW VARIABLES like 'long_query_time';--时间阈值设置
SHOW VARIABLES like '%log_queries_not_user_indexes%';--没有使用索引的SQL是否记入慢查询日志
SHOW VARIABLES like '%slow_query_log_file%';--慢日志存放位置set GLOBAL xxx = xxx;--修改参数mysqldumpslow -s (c,t,l,r,at)(排序) -t 行数 xxxslow.log --筛选慢日志
执行计划
为什么使用MySQL执行计划
因为MySQL有个东西叫SQL优化器,在写SQL时,自己想的和MySQL执行器执行的不一致。如果想具体看到SQL执行的逻辑,则需要使用执行计划查看。
参数解释
- id: 查询语句中每出现一个select关键字,MySQL就会为它分配一个唯一的ID值,如果用到临时表会有所变化,比如UNION会去重。
- select_type:SELECT****关键字对应的那个查询的类型。
- table:explain语句输出的每条记录都对应某个单表的访问语法,该条记录的table列代表该表的表名。
- partitions:匹配的分区信息。和分区表有关,一般情况下我们的查询语句的执行计划的partitions列的值都是NULL。
- type:针对单表的访问方法。
- possible_keys:可能用到的索引。
- key:实际上使用的索引。
- key_len:实际使用到的索引长度。注意! 如果允许为空则字段长度+1;如果varchar类型不定长度,则需要两个字节存储长度,则长度+2;
- ref:当使用索引列等值查询时,与索引列进行等值匹配的对象信息。
- rows:预估的需要读取的记录条数。
- filtered:某个表经过搜索条件过滤后剩余记录条数的百分比。
- Extra:—些额外的信息。
type
过执行计划的一条记录就代表着MySQL对某个表的执行查询时的访问方法/访问类型,其中的type列就表明了这个访问方法/访问类型是个什么东西,是较为重要的一个指标
出现比较多的是system>const>eq_ref>ref>range>index>ALL.
一般来说,得保证查询至少达到range级别,最好能达到ref。
- system:当表中只有一条记录并且该表使用的存储引擎的统计数据是精确的,比如MyISAM、Memory,那么对该表的访问方法就是system。
- const:就是当我们根据主键或者唯一二级索引列与常数进行等值匹配时,对单表的访问方法就是const。因为只匹配一行数据,所以很快。
- eq_ref:在连接查询时,如果被驱动表是通过主键或者唯一二级索引列等值匹配的方式进行访问的〈如果该主键或者唯一二级索引是联合索引的话,所有的索引列都必须进行等值比较),则对该被驱动表的访问方法就是eq_ref。(驱动表与被驱动表: A表和B表join连接查询,如果通过A表的结果集作为循环基础数据,然后一条一条地通过该结果集中的数据作为过滤条件到B表中查询数据,然后合并结果。那么我们称A表为驱动表,B**表为被驱动表)
- ref:当通过普通的二级索引列与常量进行等值匹配时来查询某个表,那么对该表的访问方法就可能是ref。 本质上也是一种索引访问,它返回所有匹配某个单独值的行,然而,它可能会找到多个符合条件的行,所以他属于查找和扫描的混合体
- range:如果使用索引获取某些范围区间的记录,那么就可能使用到range访问方法,一般就是在你的where语句中出现了between、<、>、in等的查询。 这种范围扫描索引扫描比全表扫描要好,因为它只需要开始于索引的某一点,而结束语另一点,不用扫描全部索引。
- index:当我们可以使用索引覆盖,但需要扫描全部的索引记录时,该表的访问方法就是index。
- ALL:全表扫描