【发布时间】:2021-11-09 06:06:42
【问题描述】:
我将问题解释如下:
(1) 数据库版本:MySQL 8.0.23
(2) 数据表名称:TB_202104 该数据表用于存储从 2021-04-01 00:00:00 到 2021-04-30 23:59:59 的数据。有99200872条数据 数据表结构如下:
创建表 TB_202104 ( OID INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, ChannelOID INT(10) 无符号非空, 时间戳 TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, 值双非空, LastUpdate TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 使用 BTREE 的主键(OID,时间戳), INDEX IDX_ChaOID(ChannelOID) 使用 BTREE, INDEX IDX_ChaOID_Timsta(ChannelOID, Timestamp) 使用 BTREE, INDEX IDX_Timsta(时间戳)使用 BTREE ) COMMENT='保存 2021/04 传感器数据' 整理='utf8_unicode_ci' 按范围分区 (unix_timestamp(`Timestamp`)) (分区 p0 值小于(1617840000)引擎 = InnoDB, 分区 p1 值小于 (1618444800) 引擎 = InnoDB, 分区 p2 值小于 (1619049600) 引擎 = InnoDB, 分区 p3 值小于 (1619827200) 引擎 = InnoDB, 分区 pMax 值小于 MAXVALUE 引擎 = InnoDB );(3) 函数名:GetMyStartDateTime 函数结构如下:
创建函数 GetMyStartDateTime() 返回时间戳 语言 SQL 不确定的 没有 SQL SQL 安全定义器 COMMENT '获取自定义开始日期和时间' 开始 返回'2021-05-01 00:00:00'; 结尾这个View表的目的是调用GetMyStartDateTime()来过滤Timestamp字段中的日期和时间数据 View表结构如下:
(4)查看表名:DynamicTB
ALTER ALGORITHM = 未定义的 SQL 安全定义器视图`DynamicTB` 作为 选择 ChannelOID 作为 ChannelOID, 时间戳作为时间戳, 价值作为价值 来自 TB_202104 其中(时间戳> = GetMyStartDateTime()) 限制 1 ;(5)当我执行以下指令时,执行时间异常长,执行未完成
选择 * 从 DynamicTB问题是在DynamicTB的View表中搜索到的TB_202104数据表在2021-05-01 00:00:00根本没有数据。
(6) 但是如果我先把DynamicTB如下:
ALTER ALGORITHM = 未定义的 SQL 安全定义器视图`DynamicTB` 作为 选择 ChannelOID 作为 ChannelOID, 时间戳作为时间戳, 价值作为价值 来自 TB_202104,其中(时间戳 >= '2021-05-01 00:00:00') 限制 1 ;然后执行:
选择 * 从 DynamicTB执行不到一秒就完成了,因为 TB_202104 在 2021-05-01 00:00:00 之后没有时间数据。
(7)目前的问题是在DynamicTB的View表中,只要调用GetMyStartDateTime()这个函数, 它会变得异常缓慢,甚至根本无法完成。
GetMyStartDateTime() 只是返回 2021-05-01 00:00:00 的值,为什么在 DynamicTB 的 View 表中调用 GetMyStartDateTime() 得到相同的值 执行异常有问题吗?
感谢您的回复。
【问题讨论】:
-
每秒大约 40 次插入。同一 OID 的两个条目是否有可能在同一秒内出现?
标签: mysql database function view procedure