mysql多表查询实例结果及分析-2017.12.14

今天帮运营导数据时发现sql执行速度非常慢,嗯,按照之前的编写习惯,后来跟架构师一起分析讨论,改进了下,现记录分析如下

一、测试表、sql情况

set @bgDate = '20171213';
set @edDate = '20171213';

/*编号①*/
SELECT TA_ID,SUM(TB.amount),SUM(TB.fee) FROM
(SELECT ORDER_NO,TA_ID FROM Table_A  WHERE TA_STATUS = 100 AND TA_CHANNEL_MERCH_NO = '201712130001'
AND SETTLE_DATE <= @endDate AND SETTLE_DATE >= @begDate )TA
LEFT JOIN
(SELECT ORDER_NO,AMOUNT,fee FROM Table_B) TB
ON TA.ORDER_NO = TB.ORDER_NO
GROUP BY TA.TA_ID;

/*编号②*/
SELECT TA.`TA_ID` AS TA_ID , sum(TA.`AMOUNT`)  AS sumAmount , sum(TB.`fee`)   AS sumMerFee FROM 
`Table_A` TA 
LEFT JOIN 
`Table_B` TB 
ON TA.`ORDER_NO` = TB.`ORDER_NO`  
WHERE  TA.`SETTLE_DATE` >= @begDate AND TA.`SETTLE_DATE` <= @endDate
  AND TA.`TA_CHANNEL_MERCH_NO`='201712130001' 
  AND TA.`TA_STATUS`=100 
  GROUP BY TA.`TA_ID` 

/*以下为表的索引情况*/
Table_A 索引:TA_ID、order_no、settle_date
Table_B 索引:order_no
/*以下为表的数据量情况*/
Table_A:10W+条记录
Table_B:10W+条记录

二、测试结果

①90s才出结果;

②1.5s就出结果;

三、分析

1、navicat-解释

编号①的TA进行了全表扫描;

2、自主分析

编号①sql

(1)虽然已减少了表数据量,但是由于新创了临时表TA、TB,都无索引,在left join时速度较慢;

(2)最后group by时,TA.TA_ID也无索引,导致再一次降低速度;

编号②sql

(1)虽然TA、TB直接全表left join,但是连接的order_no已做索引,速度还是能保证的;

(2)where和group by中涉及部分字段已加索引。

时间: 2024-07-31 05:41:40

mysql多表查询实例结果及分析-2017.12.14的相关文章

MySQL information_schema表查询导致内存暴涨

case:下面的一条sql语句,导致mysql实例内存暴涨: select * from tables where table_name not in(select table_name from partitions group by table_name having count(*)>1 ); mysql 5.5, 1w+的innodb表. 下面看下调查的结果: 1.  sql的执行情况以及内存分配:   step1: 构造information_schema.tables临时表 1.1 

MYSQL 连表查询及别名用法

MYSQL连表查询是两个表之间的查询或者更多表之间查询,通过外键的方式查询所有的数据,在查询过程中产生字段的重复,为了区分这种情况数据库设计别名,有的表很长,也可以用别名. 1,连表查询 INNER JOIN ,LEFT JOIN,RIGHT JOIN INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录.LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录.RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表

python3 mysql 多表查询

python3 mysql 多表查询 一.准备表 创建二张表: company.employee company.department #建表 create table department( id int, name varchar(20) ); create table employee( id int primary key auto_increment, name varchar(20), sex enum('male','female') not null default 'male'

MySQL多表查询回顾

----------------------siwuxie095 MySQL 多表查询回顾 以客户和联系人为例(一对多) 1.内连接 /*内连接写法一*/ select * from t_customer c,t_linkman l where c.cid=l.clid /*内连接写法二(inner 可以省略不写)*/ select * from t_customer c inner join t_linkman l on c.cid=l.clid 2.左外连接 /*左外连接(outer 可以省

mysql多表查询方法(left join(左连接),right join (右连接),inner join (内连接)的区别)

表A记录如下:  aID aNum  1 a20050111  2 a20050112  3 a20050113  4 a20050114  5 a20050115  表B记录如下:  bID bName  1 2006032401  2 2006032402  3 2006032403  4 2006032404  8 2006032408  创建这两个表SQL语句如下:  CREATE TABLE a  aID int( 1 ) AUTO_INCREMENT PRIMARY KEY ,  a

4 - MySQL:多表查询

MySQL:多表查询 一,介绍 本节主题 多表连接查询 复合条件连接查询 子查询 准备工作 #建表 create table department( id int, name varchar(20) ); create table employee( id int primary key auto_increment, name varchar(20), sex enum('male','female') not null default 'male', age int, dep_id int

记一次mysql多表查询(left jion)优化案例

一次mysql多表查询(left jion)优化案例 在新上线的供需模块中,发现某一个查询按钮点击后,出不来结果,找到该按钮对应sql手动执行,发现需要20-30秒才能出结果,所以服务端程序判断超时,故先不显示结果 以下是对这条查询的优化记录 1 数据库配置 数据库配置:4C8G 主表数据:3W+ 2 sql语句 提取sql语句,简化如下 SELECT taba.id, taba.title, taba.type, taba.end_time, tabb.username, tabc.orgna

MySQL 多表查询实现分析

1.查看第一个表 mytable 的内容: mysql> select * from mytable; +----------+------+------------+-----------+ | name | sex | birth | birthaddr | +----------+------+------------+-----------+ | abccs |f | 1977-07-07 | china | | mary |f | 1978-12-12 | usa | | tom |m

IT十八掌 Mysql 多表查询

多表查询   多表设计--外键约束 作用:保证数据的完整性 创建完语句后,可以直接使用修改语句定义 alter table 表名 add foreign key 当前表名 (字段名) references 目标表名 (目标表的主键); 分析: 有一个部门的表,还有一个员工表, create database day16; use day16; create table dept( did int primary key auto_increment, dname varchar(30) ); c