Mysql 如何解析此sql脚本!问题是我需要从表列中获取最新记录,但速度太慢了。下面是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
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
);