0

我有一個進程需要運行每X分鐘來更新某些信息。查詢需要10秒,20秒甚至一分鐘無關緊要。但重要的是,信息至少每10分鐘更新一次。限制分配給慢MySQL查詢的資源

由於查詢速度慢,而且服務器正在用於其他查詢,因此會影響其他用戶。這是我正在努力解決的情況。

我會cpulimit無論哪個進程運行查詢,但佔用所有資源的進程是MySQL服務器本身,所以看起來我需要一些MySQL特定的設置。

這是導致服​​務器凍結的單個MySQL查詢。我想限制分配給該特定查詢的資源。

+0

關於限制系統資源沒有優化器提示。限制資源的唯一方法是使用索引優化查詢。 –

+0

請閱讀。 http://meta.stackoverflow.com/a/271056/要特別關注性能部分。請編輯您的問題以提供相關的詳細信息。 –

+0

無法執行資源約束。相反,請向我們展示查詢,它的'EXPLAIN ...'和'SHOW CREATE TABLE'用於它使用的任何表格。從那裏,我們可以討論更好的索引,分成大塊等。 –

回答

0

MySQL無法告訴mysqld服務器對某些查詢使用較低優先級或較少資源。您需要專注於這些事情:

  1. 使違規查詢花費更少的時間。這可以通過一種或兩種方式來完成。

    a。將其分解爲更小的查詢

    b。創建適當的索引以使其更快速

  2. 使其對其他查詢的干擾減少。

您沒有向我們展示查詢,所以此答案的其餘部分基於猜測。

1a:在幾百或幾千條記錄的塊中進行更新。重複這些(更短)的更新,直到您的任務完成。一旦每個細分受衆羣運行起來,它就會消失,讓其他查詢結束。

1b:閱讀有關使用EXPLAIN並使用索引更快地查詢。讓你的大查詢更快。索引可以加速你的WHERE子句。

2:您可以爲您的系統設置isolation level查詢,以便它們對彼此沒有太多依賴性。這可以讓他們更優雅地共享服務器。在發出被更新作業阻止的查詢之前,發出query to set the isolation level to READ UNCOMMITTED。這將讓他們完成,並使用更新作業完成前存在的數據,而不是等待作業。

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; 

在您發出其他查詢之前。

如果您控制整個服務器,則可能更容易將READ UNCOMMITTED設置爲默認隔離級別。

+0

基本上,該進程更新SPHINX搜索數據庫,該數據庫是從其他表的視圖創建的。 –

+0

你的意思是推薦'READ COMMITTED'嗎?我從來沒有見過用'READ UNCOMMITTED'的好用例。該隔離級別破壞了原子性,因爲它允許事務查看部分完成的事務。 –

+0

我的意思是'READ UNCOMMITTED'。提問者的應用程序很可能是這種隔離級別的有效用例。每X分鐘一些新的數據到達搜索。長期運行的更新過程使其可供搜索引擎使用。如果通用查詢流量可以成功讀取舊數據而不是新數據,那麼'UNCOMMITTED'應該可以很好地工作。儘管如此,如果更新是針對或多或少的獨立數據項目,那纔是真實的。 –