我正在運行一個查詢來創建一個臨時表,但是這個限制是64mb,並且我無法更改由於訪問權限等原因造成的限制。選擇一個較大的日期範圍臨時表空間不足並導致mysql錯誤。mysql - 我可以確定或限制允許使用的內存查詢量
是否有無論如何我可以確定查詢在嘗試運行查詢之前將使用的內存大小或內存量,所以我可以優雅地避免上述問題?
我正在運行一個查詢來創建一個臨時表,但是這個限制是64mb,並且我無法更改由於訪問權限等原因造成的限制。選擇一個較大的日期範圍臨時表空間不足並導致mysql錯誤。mysql - 我可以確定或限制允許使用的內存查詢量
是否有無論如何我可以確定查詢在嘗試運行查詢之前將使用的內存大小或內存量,所以我可以優雅地避免上述問題?
除了在基本SQL查詢中查詢更少數量的行之外,沒有辦法直接限制臨時表的大小。
您能更具體地瞭解您所看到的錯誤嗎? MySQL臨時表可以在內存中存在,直到較小的的tmp_table_size
和max_heap_table_size
。如果臨時表更大,MySQL會將其轉換爲磁盤上的臨時表。
這將使臨時表比內存中的存儲慢很多,但除非you have no space available in your temp directory不應該導致錯誤。
除了臨時表存儲之外,還有很多ways MySQL uses memory。您可以調整其中的許多變量,但這與對查詢使用的內存設置限制並不相同。
錯誤1114表明您已經用完了空間。如果它是磁盤上的InnoDB表,這可能意味着您有一個沒有爲表空間定義自動擴展的ibdata1文件。對於內存表來說,這意味着你正在達到max_heap_table_size的極限。
由於您無法更改max_heap_table_size,因此您的選擇是一次減少放入表中的行數,或者使用磁盤上的臨時表而不是內存中的行。
還要小心使用最新版本的MySQL的最新版本。我發現bug 18160報告不正確地爲堆表(用於內存臨時表)的MySQL計算表大小。例如,確保您至少使用MySQL 5.0.23或5.1.10來獲得該錯誤的修復。
我不知道有一個直接的方法來完成此操作,但是您可以使用SHOW TABLE STATUS提供的有關使用表的信息,例如平均行大小,然後使用SELECT COUNT(*) ...
計算您的查詢返回的記錄數。如果您需要真正保存,請使用列類型計算行的最大大小。
也許可以更容易地檢查可處理的記錄數,然後指定固定的LIMIT子句或對SELECT COUNT(*) ...
作出反應。
感謝您的回覆,該錯誤信息即時得到是 [本地代碼:1114] [本地消息:表「dertemp」充滿] –
我將如何使用磁盤上的臨時表 的開始我的查詢看起來像 'CREATE TEMPORARY TABLE erebus.dertemp SELECT等去這裏' 我想我需要改變第一個位,並把'磁盤上'在那裏? –
'CREATE TEMPORARY TABLE erebus.dertemp ENGINE = InnoDB SELECT ...' –