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

Mysql 如何解析此sql脚本!问题是我需要从表列中获取最新记录,但速度太慢了。下面是Sql语句:,mysql,sql,groupwise-maximum,Mysql,Sql,Groupwise Maximum,有人能帮我优化这个SQL吗?我真的很感激 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

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

  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;
我正在努力找出问题所在。当我删除子查询:today\u盈余\u股票时,速度非常快。所以我们应该关注的主要问题就是这种情况。 SQL意味着我想用一个名为goods\u store\u stock\u update\u record的表查询商店的最新库存。 下表:

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; 请在下面解释执行结果:

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
1.提高主查询的性能 要提高查询的性能,您可能需要重新表述谓词:

date(gssur.create_time) = DATE('2021-05-26')`
作为:

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

date( gssur.create_time ) = date( create_time ) 
作为:


您需要向我们显示表和索引定义,以及每个表的行数。也许您的表定义不好。可能索引没有正确创建。也许你在你认为你有的专栏上没有索引。如果看不到表和索引定义,我们无法判断。我们需要行计数,因为这会影响查询规划。如果您知道如何进行
解释
或获得执行计划,请将结果也放在问题中。如果没有索引,请访问。还有:这是mysql还是Oracle?你们两个都做了标记。比你们做的更多,我将补充评论这是MySQL的。我删除了Oracle标记。另一方面:
DATE('2021-05-26')
是一个在字符串上调用的日期函数,它涉及内部数据类型转换。将此日期设置为日期“2021-05-26”
,该日期正好是日期。@thorstenkettner或省略日期位altogether@Strawberry没有。这个表达式是等价的。
create index ix1 on goods_store_stock_update_record (is_del, create_time);
date( gssur.create_time ) = date( create_time ) 
create_time >= date(gssur.create_time) and
create_time < date_add(date(gssur.create_time), interval 1 day)
create index ix2 on goods_store_stock_update_record (
  sku_code, spu_code, store_id, create_time
);