gpt4 book ai didi

php - 如果新行添加到 MySQL 表,如何实时检查

转载 作者:可可西里 更新时间:2023-11-01 07:37:15 25 4
gpt4 key购买 nike

我们有一个自动车牌阅读器,可以记录进入公司的汽车牌照。我的同事问我是否可以立即获得来车的车牌号。该软件使用 MySQL,我只有数据库访问权限。无法访问/编辑 PHP 代码。

我的建议是定期使用查询进行检查。例如 10 秒。但这样一来就有可能错过5秒后过来的车。然后减少间隔会增加请求/响应计数,这意味着服务器的额外负载。 我不希望脚本一直运行。它应该只运行添加的新数据库行。它显示盘子并退出。

如何在插入后立即从数据库中获取最后记录的行?我的意思是应该有触发器在插入后运行我的 PHP 脚本。但我不知道。

我想要的是 MySQL 可以在一条新记录后运行我的 PHP 脚本。

最佳答案

如果您的表是 MyISAM,我会坚持您最初的想法。从 MyISAM 表中获取行数是即时的。它只需要读取一个值,因为 MyISAM 始终保持行计数。

有了InnoDB,这种方式还是可以接受的。假设car_table.id为主键,SELECT COUNT(id) FROM car_table只需要一次索引扫描,速度非常快。您可以通过向表中添加另一个索引 bool 列来改进此想法:

ALTER car_table ADD COLUMN checked BOOLEAN NOT NULL DEFAULT 0, ADD INDEX (checked);

默认值确保插入新车时将此标志设置为 0,而无需修改插入语句。然后:

BEGIN TRANSACTION; -- make sure nobody interferes
SELECT COUNT(checked) FROM car_table WHERE checked = FALSE FOR UPDATE; -- this gets you the number of new, unchecked cars
UPDATE car_table SET checked = TRUE WHERE checked = FALSE; -- mark these cars as checked
COMMIT;

这样,您在每次轮询时只扫描非常少量的索引条目。

一种更高级的方法是通过触发器将新创建的汽车 ID 添加到边表中。时不时地扫描这个副表,不锁定主表,也不改变它的结构。在每次轮询后简单地TRUNCATE这个边表。

最后,正如 Panagiotis 所建议的那样,还有触发 UDF 的选项,但在大多数情况下这似乎是一种矫枉过正的做法。

关于php - 如果新行添加到 MySQL 表,如何实时检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21019886/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com