php – 如何在MySQL表中添加新行时实时检查

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

我的提议是定期检查使用查询.例如10秒.但通过这种方式,可能会错过5秒钟内的车辆.然后减少间隔会增加请求/响应计数,这意味着服务器的额外负载.我不希望脚本始终运行.它应该只运行一个新的db行.它显示了板和出口.

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

我想要的是MySQL可以在新记录之后运行我的PHP脚本.

最佳答案 如果你的桌子是MyISAM,我会坚持你最初的想法.从MyISAM表中获取行计数是即时的.它只需读取一个值,因为MyISAM始终保持行数.

使用InnoDB,这种方法仍然可以接受.假设car_table.id是主键,SELECT COUNT(id)FROM car_table只需要索引扫描,这非常快.您可以通过向表中添加另一个索引布尔列来改进此想法:

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添加到边桌中.不时地扫描该边桌,而不锁定主桌,并且不改变其结构.每次轮询后,只需截断此边桌.

最后,正如Panagiotis所建议的,可以选择触发UDF,但在大多数情况下这似乎是一种过度杀伤力.

点赞