mysql(二) 慢查询分析(一)

如下表结构:

CREATE TABLE `trade_order` (
  `order_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT ‘订单编号‘,
  `total_price` bigint(20) DEFAULT NULL COMMENT ‘订单总价‘,
  `item_name` varchar(128) DEFAULT NULL COMMENT ‘商品名称‘,
  `mobile` varchar(16) DEFAULT NULL COMMENT ‘下单电话‘,
  `gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modify` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`order_id`)
) ENGINE=InnoDB AUTO_INCREMENT=239 DEFAULT CHARSET=utf8mb4;
CREATE TABLE `trade_sub_order` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `order_id` bigint(20) DEFAULT NULL COMMENT ‘订单号‘,
  `item_price` bigint(20) DEFAULT NULL COMMENT ‘商品单价‘,
  `item_nums` int(11) DEFAULT NULL COMMENT ‘商品数量‘,
  `gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modify` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `order_index` (`order_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1227 DEFAULT CHARSET=utf8mb4;

在执行联合查询时,如下2种写法的执行计划有明显差别。

第一种:

select * from trade_order left join `trade_sub_order` using(`order_id`) order by `trade_order`.`order_id` desc;

第二种:

select * from trade_order left join `trade_sub_order` using(`order_id`) order by `trade_sub_order`.`order_id` desc;

两者的差别在于order by的表字段不同。

看执行计划:

第一种的执行计划:

第二种的执行计划:

rows的差别忽略,因为数据在不停的新增过程中。

第一种方式有主键索引,不需要使用临时表。第二种全表扫描,使用临时表,使用文件排序。

这里面的关键问题在于,MySQL 表关联的算法是“Nest Loop Join”,是通过驱动表的结果集作为循环基础数据,然后一条一条地通过该结果集中的数据作为过滤条件到下一个表中查询数据,然后再合并结果(临时表)。

在explain中,第一行出现的表就是驱动表,对于驱动表字段的排序可以直接进行,对于非驱动表字段的排序需要对循环查询的合并结果(临时表)进行排序。所以在第二种写法下就会出现Using temporary。而且由于对非驱动表字段排序,导致将驱动表的全表数据作为驱动表的结果集,产生全表扫描,无法使用到主键索引。

所以,在explain中,有Using temporary时,需要关注是否使用非驱动表字段做排序处理。

驱动表的定义:

在进行多表连接查询时,

  • 指定了连接条件,满足查询查询条件的记录数少的表为驱动表;
  • 未指定连接条件,行数少的表为驱动表;

原文地址:https://www.cnblogs.com/asfeixue/p/9125172.html

时间: 2024-08-28 17:24:21

mysql(二) 慢查询分析(一)的相关文章

MySQL的慢查询分析

慢查询分析日最初是用来捕获比较“慢”的查询,在mysql5.1 + 版本中,慢查询的功能被加强,可以通过设置long_query_time为0来捕获所有的查询,而且查询的响应时间已经可以做到微妙级别. ---在MySQL的当前版本中,慢查询日志是开销最低,精确度最高的测量查询时间的工具.如果还在担心开启慢查询会带来额外的I/O开销,那大可以放心,我们在I/O密集型场景做过测试,慢查询带来的开销可以忽略不计(实际上CPU密集型场景的影响还稍大一些) 更需要担心的是日志可能会消耗掉很大的磁盘空间,因

MySQL慢日志查询分析方法与工具

MySQL中的日志包括:错误日志.二进制日志.通用查询日志.慢查询日志等等.这里主要介绍下比较常用的两个功能:通用查询日志和慢查询日志. 1)通用查询日志:记录建立的客户端连接和执行的语句. 2)慢查询日志:记录所有执行时间超过long_query_time秒的所有查询或者不使用索引的查询 MySQL日志文件系统的组成   a.错误日志:记录启动.运行或停止mysqld时出现的问题.   b.通用日志:记录建立的客户端连接和执行的语句.   c.更新日志:记录更改数据的语句.该日志在MySQL

mysql(三) 慢查询分析(二)

在一般的查询中,都要求尽量围绕创建的索引进行.针对索引,常用的有主键索引,单列索引,组合索引,索引合并等. 在评价索引时,关键看区分度.索引区分度=索引列唯一值/表记录数. 如果在区分度很低的列上建索引,那索引扫描的rows会相当大,该索引的性能表现就基本接近全表扫描了. 主键索引 是一种特殊的唯一索引,不允许有空值. 单列索引 针对表的单一列设置索引. 组合索引 针对表的多列按列顺序设置索引.在组合索引中,基于BTree的原理,存在一个最左前缀匹配原则.如下索引(mobile_price_cr

一次MySQL线上慢查询分析及索引使用

本文由作者郑智辉授权网易云社区发布. 0.前言 本文通过分析线上MySQL慢查询日志,定位出现问题的SQL,进行业务场景分析,结合索引的相关使用进行数据库优化.在两次处理问题过程中,进行的思考. 1.简要描述 在九月底某个新上的游戏业务MySQL慢查询日志 # Time: 2017-09-30T14:56:13.974292+08:00 # Query_time: 6.048835  Lock_time: 0.000038 Rows_sent: 0  Rows_examined: 1288441

mysql性能优化-慢查询分析、优化索引和配置

一.优化概述 二.查询与索引优化分析 1性能瓶颈定位 Show命令 慢查询日志 explain分析查询 profiling分析查询 2索引及查询优化 三.配置优化 1)      max_connections 2)      back_log 3)      interactive_timeout 4)      key_buffer_size 5)      query_cache_size 6)      record_buffer_size 7)      read_rnd_buffer

MySQL慢日志查询全解析:从参数、配置到分析工具【转】

转自: MySQL慢日志查询全解析:从参数.配置到分析工具 - MySQL - DBAplus社群——围绕数据库.大数据.PaaS云,运维圈最专注围绕“数据”的学习交流和专业社群http://dbaplus.cn/news-11-694-1.html 一.慢查询日志概念 MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中.long_query_time的默认值为

Linux下MySQL慢查询分析mysqlsla安装使用

说明: 操作系统:CentOS 5.X 64位 MySQL版本:mysql-5.5.35 MySQL配置文件:/etc/my.cnf MySQL 数据库存放目录:/data/mysql 实现目的:开启MySQL慢查询日志功能,安装使用MySQL慢查询分析mysqlsla 具体操作: 一.开启MySQL慢查询功能 mysql -u  root -p  #进入MySQL控制台 show variables like '%slow%';   #查看MySQL慢查询是否开启 set global slo

mysql性能优化-慢查询分析、优化索引和配置【转】

一.优化概述 二.查询与索引优化分析 1性能瓶颈定位 Show命令 慢查询日志 explain分析查询 profiling分析查询 2索引及查询优化 三.配置优化 1)      max_connections 2)      back_log 3)      interactive_timeout 4)      key_buffer_size 5)      query_cache_size 6)      record_buffer_size 7)      read_rnd_buffer

mysql慢查询分析工具比较与实战

00 前言 在进行mysql性能优化的时候,第一个想到的便是查看慢sql. 但是对于慢sql有没有什么好的工具进行分析呢? 推荐两个工具mysqldumpslow及pt-query-digest. mysqlslowdump较为简单,常用命令: #得到返回记录最多的20个sql mysqldumpslow -s r -t 20 slowSQl.log # 得到平均访问次数最多的20条sql mysqldumpslow -s ar -t 20 slowSQl.log 如果linux上没有安装mys