TiDB预处理Prepare / Execute多个变量unix_timestamp()如何使用改写

【 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语句中的多个变量,可以使用以下方法:

  1. 在Prepare语句中使用unix_timestamp()函数来获取当前时间的时间戳,例如:
PREPARE stmt FROM 'SELECT * FROM table WHERE time > ?';
SET @time = UNIX_TIMESTAMP();
EXECUTE stmt USING @time;
  1. 如果您需要在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语句中的多个变量,同时使用多个?占位符来表示这些变量。

此话题已在最后回复的 60 天后被自动关闭。不再允许新回复。