如果你的表是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添加到边桌中。此边桌每隔一段时间扫描一次,不锁定主表,也不改变其结构。每次轮询后,只需要TRUNCATE
这个旁边的桌子。
最后,根据Panagiotis的建议,可以选择触发UDF,但在大多数情况下这似乎是一种矫枉过正。
可能重复[查询设置时间?](http://stackoverflow.com/questions/20929045/querying-for-a-set-time) –
您有权访问php板块插入脚本吗? – Syd
@PanagiotisGeorgeRaditsas不,我没有访问脚本,正如我所提到的。我只能读取db。 – zkanoca