TRIGGER 会提高性能吗?

Goo*_*bot 5 mysql trigger performance mysql-5.5 query-performance

我知道TRIGGERs 很有用,因为它们负责后续查询,但是从性能的角度来看,它们也有优势吗?

将两个或三个查询替换为

INSERT INTO table1 ...
UPDATE table2 ...
UPDATE table3 ...
Run Code Online (Sandbox Code Playgroud)

使用基于触发器的查询作为

INSERT INTO table 1
Run Code Online (Sandbox Code Playgroud)

带触发器

CREATE TRIGGER test
AFTER INSERT ON table1
FOR EACH ROW BEGIN
UPDATE table2 ... WHERE id=NEW.id;
UPDATE table3 ... WHERE id=NEW.id;
END
Run Code Online (Sandbox Code Playgroud)
  1. 我们仍然拥有相同性能的三个查询吗?我的意思是我们执行后续查询或执行TRIGGER是否重要?

  2. 如果我们使用 API(例如通过 PHP 进行查询)会怎样。后续查询是内部的,无需连接器/驱动程序。是否TRIGGER提高了性能?

附加信息:数据库是带有 innoDB 的 mysql 5.5。

Ray*_*and 3

我假设table1、table2和table3也是InnoDB表。

由于自动提交,每个插入/更新都会写入磁盘(数据/索引树更新),这会很慢,并且您不能使用 BEGIN TRANSACTION 和 COMMIT 来加快速度。

如果table1、table2和table3不是InnoDB,而是MyISAM(表锁定)或Memory(表锁定),这可能会导致不需要的表锁定“功能”,从而会减慢速度。

编辑是因为关闭注释仅分析了触发器代码背后的源代码的一小部分,我将更详尽地分析触发器背后的源代码,以查看是否存在任何性能影响以及这可能产生的相对性能影响。

  • 这种分析是完全错误的。您谈到从内存中读取 - 嗯,*这是触发器加载到*内存中以供稍后使用的地方*。调用 check_n_load 的唯一有意义的时间是打开表并将其添加到表定义缓存时。触发器是从“sql_delete.cc”、“sql_insert.cc”、“sql_update.cc”调用的,并且服务器绝对不会在每次调用时打开和读取文件。显然,无论何时何地,不带触发器的查询都比带触发器的查询更快,但这不是重点;正如您所推测的那样,触发器没有问题。 (2认同)