美文网首页
腾讯云SQL优化大赛解析(初赛)

腾讯云SQL优化大赛解析(初赛)

作者: 飞翔的Tallgeese | 来源:发表于2019-11-05 15:00 被阅读0次

建表

CREATE TABLE `order` (

  `id` bigint(20) NOT NULL AUTO_INCREMENT,

  `name` varchar(32) NOT NULL,

  `creator` varchar(24) NOT NULL,

  `price` varchar(64) NOT NULL,

  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,

  `status` tinyint(1) not null,

  PRIMARY KEY (`id`)

);

CREATE TABLE `order_item` (

  `id` bigint(20) NOT NULL AUTO_INCREMENT,

  `name` varchar(32) NOT NULL,

  `parent` bigint(20) NOT NULL,

  `status` int not null,

  `type` varchar(12) NOT NULL DEFAULT '0',

  `quantity` int not null default 1,

  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,

  PRIMARY KEY (`id`)

);

待优化语句①

SELECT *

FROM  `order` o

      INNER JOIN order_item i ON i.parent = o.id

ORDER  BY o.status ASC,

          i.update_time DESC

LIMIT  0, 20;

o表大约2000数据,i表大约50W行数据


思路

o表的status只有1和0这2种值,分别令status的值=1和=0,分别取前20,再把结果集UNION ALL起来在进行一次排序。

如果不采用这种方式,将会走全表扫描之后再进行2次排序,扫描行数非常多,相当耗时

官方答案

SELECT o.*,i.*

FROM  (

        (SELECT o.id,

            i.id item_id

      FROM  `order` o

            INNER JOIN order_item i

                    ON i.parent =o.id

          WHERE  o.status = 0

          ORDER  BY i.update_time DESC

          LIMIT  0, 20)

          UNION ALL

          (SELECT o.id,

            i.id item_id

          FROM  `order` o

            INNER JOIN order_item i

                    ON i.parent =o.id

          WHERE  o.status = 1

          ORDER  BY i.update_time DESC

          LIMIT  0, 20)

        ) tmp

      INNER JOIN `order` o ON tmp.id = o.id

      INNER JOIN order_item i ON tmp.item_id =i.id

ORDER  BY o.status ASC,

          i.update_time DESC

LIMIT  0, 20;

需添加的索引

alter table order_item add index idx_1(update_time,parent);

alter table `order` add index idx_0(status);


待优化语句②

update `order` set

create_time = now()

where id in (

    select parent from order_item where type = 2

);

该语句第一眼望过去涉及到2个知识点,第一个反应是in改inner join,第二个是临时表内的去重。

按照官方说法,这个语句除了上面的2个知识点外,还有对数据类型的核对,type是一个varchar类型,而临时表的查询直接改变了类型;其次在对临时表的去重过程中,很多人使用了distinct,按照官方说法,临时表的distinct会造成半连接失效,所以这里不能用distinct,而是需要用group by。

需要添加的索引

alter table `order` add index idx_1(type,parent);

语句改写

update `order` o inner join

(select type,parent from`order_item`where type='2' group by type,parent) i 

on o.id = i.parent

set create_time =now();

关于半连接

MySQL半连接


大赛官方解析链接

腾讯云数据库优化初赛

相关文章

  • 腾讯云SQL优化大赛解析(初赛)

    建表 CREATE TABLE `order` ( `id` bigint(20) NOT NULL AUTO_...

  • MySQL-运行机制

    SQL-运行机制.png 查询缓存: 解析器: 预处理器: 语义解析 生成新的解析树 查询优化器: 因为一条SQL...

  • mysql查询优化02-查看执行计划

    查询优化处理 查询优化的3个阶段 解析器:将sql变成解析树 预处理器:检查解析树的语法是否正确如表或字段是否存在...

  • 关于SQL硬解析的查找和PROC(C语言)对应的ORACLE优化

    关于SQL硬解析的查找和PRO*C优化方法 [TOC] 1. 硬解析的原理 提到软解析(soft prase)和硬...

  • MySQL中的SQL常见调优策略测试

    优化SQL最重要点就是避免全文搜索,下面我会举几个例子,用explain解析优化策略: 前面工作: create ...

  • MySQL优化

    MySQL架构 网络连接层 服务层连接池系统管理和控制SQL接口解析器, 对SQL语句检查,生成解析树查询优化器缓...

  • SQL实战研究InnoDB架构设计

    业务系统通过一个数据库连接发给MySQL,经过SQL接口、解析器、优化器、执行器,解析SQL语句,生成执行计划,接...

  • mysql层次结构

    mysql大体结构 连接层,通过sock进行通信,提供api供客户端使用 sql层,解析,优化sql语句,选择最优...

  • mysql深入学习01

    1.体系结构 Mysql是由SQL接口,解析器,优化器,缓存,存储引擎组成的(SQL Interface、Pars...

  • spark sql 核心Catalyst 优化器

    Spark SQL的核心是Catalyst优化器,对 SQL 或者DSL 代码解析生成逻辑计划,并对逻辑计划进行优...

网友评论

      本文标题:腾讯云SQL优化大赛解析(初赛)

      本文链接:https://www.haomeiwen.com/subject/fpfqbctx.html