2014-01-09 42 views
4

我們有一個自動車牌閱讀器,記錄汽車進入公司的車牌。我的同事問我是否可以立即得到車的車牌號碼。該軟件使用MySQL,我只有數據庫訪問權限。無法訪問/編輯PHP代碼。如何將新行添加到MySQL表中實時檢查

我的提議是定期檢查使用查詢。例如10秒鐘。但通過這種方式,可能會在5秒內錯過汽車。然後減小間隔會增加請求/響應計數,這意味着服務器的額外負載。 我不希望腳本始終運行。它應該只運行一個新的數據庫行添加。它顯示板塊並退出。

如何在插入後立即從db獲取最後記錄的行?我的意思是應該有插入後運行我的PHP腳本的觸發器。但是我不知道。

我想要的是MySQL可以在新記錄後運行我的PHP腳本。

+0

可能重複[查詢設置時間?](http://stackoverflow.com/questions/20929045/querying-for-a-set-time) –

+0

您有權訪問php板塊插入腳本嗎? – Syd

+0

@PanagiotisGeorgeRaditsas不,我沒有訪問腳本,正如我所提到的。我只能讀取db。 – zkanoca

回答

2

如果你的表是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,但在大多數情況下這似乎是一種矯枉過正。

+0

好方法! +1「MyISAM始終保持行數」 – Syd

+0

這也出現在我的腦海中:從觸發器內寫入外部文件(使用['SELECT ... INTO OUTFILE'](http://dev.mysql .com/doc/refman/5.6/en/select-into.html)),並用['inoticoming'](http://askubuntu.com/questions/43846/how-to-put-一個觸發式-A-目錄/ 43848#43848)。但是,如果你採取這種方式,請不要告訴任何人我建議這樣做。我會否認。 – RandomSeed

相關問題