首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何解析这个sql脚本!问题是我需要从表列中获取最新的记录,但是速度太慢了。下面是Sql语句:

如何解析这个sql脚本!问题是我需要从表列中获取最新的记录,但是速度太慢了。下面是Sql语句:
EN

Stack Overflow用户
提问于 2021-05-27 10:55:54
回答 1查看 48关注 0票数 0

有人能帮我优化一下这个SQL吗?我真的很感激。

代码语言:javascript
复制
  SELECT
    gssur.id,
    date( gssur.create_time ) time,
    gssur.store_id,
    gssur.store_name,
    gssur.goods_id,
    gssur.spu_code,
    gssur.sku_code,
    gssur.goods_name,
    gssur.property_value,
    sum(
    IF
    ( gssur.data_source = 3 OR gssur.data_source = 4, ifnull( gssur.adjust_number, 0 ), 0 )) today_consumption,
    sum(
    IF
    ( gssur.data_source = 2 OR gssur.data_source = 1, ifnull( gssur.adjust_number, 0 ), 0 )) today_adjust_number,
    (
    SELECT
        adjust_after 
    FROM
        goods_store_stock_update_record 
    WHERE
        date( gssur.create_time ) = date( create_time ) 
        AND gssur.sku_code = sku_code 
        AND gssur.spu_code = spu_code 
        AND gssur.store_id = store_id 
    ORDER BY
        create_time DESC 
        LIMIT 1 
    ) today_surplus_stock 
FROM
    goods_store_stock_update_record gssur 
WHERE
    date( gssur.create_time ) = DATE( '2021-05-26' ) 
    AND gssur.is_del = 0 
GROUP BY
    time,
    gssur.sku_code,
    gssur.spu_code,
    gssur.store_id;

我正在试着找出问题所在。当我移除subquery:today_surplus_stock时,它的速度非常快。所以我们应该关注的主要问题是这种情况。SQL意味着我要使用名为goods_store_stock_update_record的表来查询商店的最新库存。MYSQL表定义如下:

代码语言:javascript
复制
CREATE TABLE `goods_store_stock_update_record` (
  `id` varchar(64) CHARACTER SET utf8 NOT NULL COMMENT '主键',
  `store_id` varchar(64) CHARACTER SET utf8 DEFAULT NULL COMMENT '门店id',
  `goods_id` varchar(64) CHARACTER SET utf8 DEFAULT NULL COMMENT '商品id',
  `spu_code` varchar(64) CHARACTER SET utf8 DEFAULT NULL COMMENT 'spu编码',
  `sku_code` varchar(64) CHARACTER SET utf8 DEFAULT NULL COMMENT 'sku编码',
  `adjust_type` tinyint(1) DEFAULT NULL COMMENT '调整类型 1-增加 2-减少',
  `adjust_number` bigint(20) DEFAULT NULL COMMENT '调整数量(正整数)',
  `adjust_before` bigint(20) DEFAULT NULL COMMENT '调整前数量',
  `adjust_after` bigint(20) DEFAULT NULL COMMENT '调整后数量',
  `data_source` tinyint(1) DEFAULT NULL COMMENT '数据来源 1-系统添加 2-手动添加 3-APP核销扣减 4-POS机核销扣减',
  `remarks` varchar(100) DEFAULT NULL COMMENT '备注',
  `goods_name` varchar(32) CHARACTER SET utf8 DEFAULT NULL COMMENT '商品名称',
  `property_value` varchar(32) CHARACTER SET utf8 DEFAULT NULL COMMENT '属性值',
  `store_name` varchar(32) CHARACTER SET utf8 DEFAULT NULL COMMENT '门店名称',
  `time_format` date DEFAULT NULL COMMENT '时间(年月日-yyyy-MM-dd)',
  `is_del` tinyint(1) DEFAULT NULL COMMENT '逻辑删除',
  `create_by` varchar(64) CHARACTER SET utf8 DEFAULT NULL COMMENT '创建人',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `update_by` varchar(64) CHARACTER SET utf8 DEFAULT NULL COMMENT '修改人',
  `update_time` datetime DEFAULT NULL COMMENT '修改时间',
  PRIMARY KEY (`id`) USING BTREE,
  KEY `ix2` (`sku_code`,`spu_code`,`store_id`,`create_time`),
  KEY `ix1` (`is_del`,`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='商品门店库存调整记录表';

没有创建索引,表数约为25193;Explain的执行结果如下:

代码语言:javascript
复制
1   PRIMARY gssur       ALL                 30942   10.00   Using where; Using temporary; Using filesort
2   DEPENDENT SUBQUERY  goods_store_stock_update_record     ALL                 30942   0.10    Using where; Using filesort
EN

回答 1

Stack Overflow用户

发布于 2021-05-27 11:28:19

1.提高主查询的性能

为了提高查询的性能,您可能需要重新表述谓词:

代码语言:javascript
复制
date(gssur.create_time) = DATE('2021-05-26')`

作为:

代码语言:javascript
复制
gssur.create_time >= '2021-05-26' and gssur.create_time < '2021-05-27'

这将提升您需要创建的以下索引中的使用率:

代码语言:javascript
复制
create index ix1 on goods_store_stock_update_record (is_del, create_time);

2.提高标量子查询的性能

此外,您的查询作为其中的标量子查询。要提高此子查询的性能,您需要重新表述条件

代码语言:javascript
复制
date( gssur.create_time ) = date( create_time ) 

作为:

代码语言:javascript
复制
create_time >= date(gssur.create_time) and
create_time < date_add(date(gssur.create_time), interval 1 day)

这将提升您需要创建的以下索引中的使用率:

代码语言:javascript
复制
create index ix2 on goods_store_stock_update_record (
  sku_code, spu_code, store_id, create_time
);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67715060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档