我有一個每隔幾分鐘執行一次MySQL查詢的cronjob,總結MyISAM表中的大量行。但是,如果此表被鎖定幾分鐘,那麼這些彙總查詢將堆積起來,因此即使表再次可用時,它們也會長時間阻止它。如果表被鎖定,則忽略MySQL查詢
這些查詢都不是必不可少的,所以我很高興與他們不時失敗。因此,如果這些查詢僅在表被阻塞超過一秒或兩秒時失敗,我纔會更喜歡它。
有沒有辦法向MySQL提交一個查詢,如果它等待表鎖超過幾秒就會自動被殺死?我能以某種方式將查詢標記爲不重要嗎?
我有一個每隔幾分鐘執行一次MySQL查詢的cronjob,總結MyISAM表中的大量行。但是,如果此表被鎖定幾分鐘,那麼這些彙總查詢將堆積起來,因此即使表再次可用時,它們也會長時間阻止它。如果表被鎖定,則忽略MySQL查詢
這些查詢都不是必不可少的,所以我很高興與他們不時失敗。因此,如果這些查詢僅在表被阻塞超過一秒或兩秒時失敗,我纔會更喜歡它。
有沒有辦法向MySQL提交一個查詢,如果它等待表鎖超過幾秒就會自動被殺死?我能以某種方式將查詢標記爲不重要嗎?
您可以檢查,看是否有表,通過查看打開的表,使用命令鎖定:
show open tables;
如果你看到你的表鎖定,您可以使它之前取消查詢。 Doc here。
它也像5.7是要實現SELECT超時正確:http://mysqlserverteam.com/server-side-select-statement-timeouts/
看看pt-kill
(Percona的工具包)。如果需要,您可以向cron查詢添加可識別的註釋以幫助定位查詢。值得使用--sentinel
標誌來讓你安全地導致pt-kill
退出。
此外,如果您將鎖定添加到cron作業,那麼您將防止堆積。
更好的方法是運行這些查詢之一嗎?這將阻止發生堆積。做一些semafore(甚至文件類型標誌)來查看是否有某個查詢已經在等待,如果是的話,不要啓動另一個查詢)。
正如你所說,如果有些沒有運行,這並不壞,這可能更容易實施。