Mysql 更快的是:在查询中调用用户declareed函数,还是通过触发器设置值?

Mysql 更快的是:在查询中调用用户declareed函数,还是通过触发器设置值?,mysql,query-optimization,Mysql,Query Optimization,有一个声明的MySQL函数GETUSERID()返回一个整数值。如何更快地插入记录:从查询内部设置值,如 INSERT INTO ttable (idtoset, some_other_field...) VALUES (GETUSERID(), value1...); 还是打电话 INSERT INTO ttable (some_other_field...) VALUES (value1...); 并通过插入前触发的触发器填充idtoset 如果查询正在执行多行插入,该怎么办 I

有一个声明的MySQL函数
GETUSERID()
返回一个整数值。如何更快地插入记录:从查询内部设置值,如

INSERT INTO ttable 
(idtoset, some_other_field...) 
VALUES (GETUSERID(), value1...);
还是打电话

INSERT INTO ttable 
(some_other_field...) 
VALUES (value1...);
并通过插入前触发的触发器填充
idtoset

如果查询正在执行多行插入,该怎么办

INSERT INTO ttable 
(idtoset, some_other_field...) 
VALUES (GETUSERID(), value1...), 
(GETUSERID(), value2...),
... 
(GETUSERID(), valueN...);
?

编辑

我刚刚调查了@Rahul的答案。 我创建了一个带有两个触发器的ttest表

CREATE TRIGGER `tgbi` BEFORE INSERT ON `ttest` FOR EACH ROW BEGIN
SET NEW.testint=1;
END;

CREATE TRIGGER `tgbi` BEFORE UPDATE ON `ttest` FOR EACH ROW BEGIN
SET NEW.testint=2;
END;
如果我没有弄错的话,如果插入前触发器调用
更新集
第二个触发器也会触发,并且创建的testint值可能是=2,但在每个插入的行中它都是=1。这是否意味着引擎优化了插入过程并与通过查询手动设置的值同时设置该值

应@Rick James的请求追加。问题不在于确定的功能。它实际上是关于任何函数的。如果从触发器或INSERT查询插入记录,则调用任何函数的次数都相同。这就是为什么我想知道,从MySQL引擎的角度来看,有什么更好的方法——在插入的记录中手动设置值,或者通过触发器填充值

CREATE DEFINER=`***`@`***` FUNCTION `GETUSERID`() RETURNS int(10)
BEGIN
DECLARE id_no INT DEFAULT -1;
SELECT `id` INTO id_no FROM `tstuff` 
WHERE `tstuff`.`user_name`=
(SELECT SUBSTRING_INDEX(USER(), '@', 1)) LIMIT 1;
RETURN id_no;
END
什么更快?不知道,因为我还没有做过基准测试,但根据我的知识,直接执行
插入
操作比插入操作更好,然后通过触发器执行
更新

您当前正在做的事情是否不起作用?您也可以将其设置为插入。。选择类似操作的

INSERT INTO ttable (idtoset, some_other_field...) 
SELECT GETUSERID(), value1..., valuen FROM DUAL;

在以前的MySQL版本中,使用before insert触发器填充不可为null的列是行不通的,因为MySQL在触发器之前评估提供的列。这就是为什么每当我遇到这种情况时,我通常倾向于使用函数而不是触发器


从性能角度来看,由于插入前触发器是在实际写入数据之前进行评估的,因此执行此操作所需的时间几乎与使用函数和不使用触发器立即获取值相同。但是如果您在触发器中所做的一切都是设置用户ID,那么我真的看不到使用触发器的理由。

为什么不直接使用
自动增量
ID?或
uuid()
?@Gordon Linof。这是一个样本。选择任何其他用户定义的函数,返回从另一个表中选择或计算的整数值。。。SET(…)语法正确。
触发器有很多额外的负担。一个
存储函数
,比如GETUSERID可能会有很多行李;“里面是什么?对不起,”里克·詹姆斯,因为打字错误。更正。真正的代码,当然,工作。谢谢你,功能正常工作。我只是想知道什么更快。触发器调用
更新集的想法非常有趣。@asd tm,如前所述;我不知道什么更快,但唯一的一点是:当你可以在一次插入中执行任务时,为什么要使用触发器并执行插入+更新。谢谢你,@benohead这就是我在编辑我的帖子时所假设的。这只是一个样本。我试图找出是否有一个真正的根本原因,选择一种方法而不是另一种方法。在更复杂的示例中使用触发器的一个优点是使应用程序代码更易于阅读,因为MySQL服务器支持的其他函数的逻辑将在其一侧执行,并且此类触发器将透明地作为默认字段工作。