在SQL查詢進行 group by汉操、order by余素、distinct、union镜沽、多表更新敏晤、group_concat、count(distinct)缅茉、子查詢或表連接的情況下茵典,MySQL 有可能會使用內部臨時表。MySQL 首先在內存中創(chuàng)建 Memory 引擎臨時表宾舅,當臨時表的尺寸過大時统阿,會自動轉換為磁盤上的 MyISAM 引擎臨時表(當查詢涉及到 Blob 或 Text 類型字段,MySQL 會直接使用磁盤臨時表)筹我。
這個錯誤信息扶平,說明磁盤上的臨時表 #sql_19472_5 的物理尺寸受到限制,已經無法再繼續(xù)擴展了蔬蕊。
導致這個錯誤信息的原因是查詢語句使用的內部磁盤臨時表(MyISAM 引擎表)總大小已經達到了實例參數loose_rds_max_tmp_disk_space指定的限制(默認?10 GB)结澄。
在控制臺
參數設置中根據 RDS 實例當前空閑空間和應用空間使用情況,調高參數loose_rds_max_tmp_disk_space的設置,建議考慮設置為略小于當前空閑空間(保留一部分空間以便 Binlog 和 數據文件使用)麻献,以避免磁盤臨時表總占用空間過高们妥,超過實例規(guī)格而導致實例鎖定,影響業(yè)務勉吻。該參數單位是 字節(jié)(Byte)监婶,默認 10 GB,上限 1000 GB齿桃。
注:修改該參數會自動重啟 RDS 實例惑惶。
減少同時使用磁盤臨時表的會話數量。因為參數 loose_rds_max_tmp_disk_space 指定的是磁盤臨時表文件的總大小短纵,因此減少并發(fā)使用磁盤臨時表的會話數量可以避免超過該參數指定的限制带污。
可以通過在控制臺
參數設置 中調高tmp_table_size參數值來調高內存臨時表的上限。
注:tmp_table_size 單位字節(jié)(Byte)香到,默認 256 KB鱼冀,最大64 MB。
在查詢中悠就,盡量避免使用 Blog 和 Text 類型字段雷绢。
優(yōu)化查詢邏輯,避免過大的中間數據集操作理卑。
查看?explain SQL 命令的輸出翘紊,在 Extra 字段中有 Using temporary 字樣的代表會使用內部臨時表。比如:
select*fromalarmgroupbycreated_on orderbydefault;