【 TiDB 使用环境】生产环境
【 TiDB 版本】v5.4.1
【遇到的问题:问题现象及影响】
通过TiDB Dashboard查看有很多类似的慢查询,查看其中一个慢查的执行时间如下:
生成执行计划消耗了大部分的时间
想到了使用预处理Prepare / Execute的方式改写查询。
由于慢查询中存在大量的unix_timestamp()函数,导致无法缓存该执行计划
[test]>select @@last_plan_from_cache;
+------------------------+
| @@last_plan_from_cache |
+------------------------+
| 0 |
+------------------------+
查看Grafana->TiDB->Executor->Queries Using Plan Cache OPS
如果把unix_timestamp()用?代替,execute st using @time1,@time2,time3…;参数又太多。现寻求其它的改写方案。谢谢!
如果您想在TiDB中使用unix_timestamp()
函数来替换Prepare/Execute语句中的多个变量,可以使用以下方法:
- 在Prepare语句中使用
unix_timestamp()
函数来获取当前时间的时间戳,例如:
PREPARE stmt FROM 'SELECT * FROM table WHERE time > ?';
SET @time = UNIX_TIMESTAMP();
EXECUTE stmt USING @time;
- 如果您需要在Prepare/Execute语句中使用多个变量,可以使用多个
?
占位符来表示这些变量,例如:
PREPARE stmt FROM 'SELECT * FROM table WHERE time > ? AND id = ?';
SET @time = UNIX_TIMESTAMP();
SET @id = 1;
EXECUTE stmt USING @time, @id;
在这个例子中,?
占位符表示Prepare/Execute语句中的变量,@time
和@id
是TiDB中的用户变量,分别用来存储时间戳和ID值。
综上所述,您可以使用unix_timestamp()
函数来替换Prepare/Execute语句中的多个变量,同时使用多个?
占位符来表示这些变量。
system
(system)
关闭
4
此话题已在最后回复的 60 天后被自动关闭。不再允许新回复。