臨時表與內存表
內存表是 Memory 引擎表,表的數據行都在內存。
臨時表可以使用各種引擎。
臨時表是線程私有表,其他線程不可見,不需考慮重名問題。
session 結束時臨時表會被自動刪除。
如果 Binlog_format = row,則臨時表語句不進入 binlog,不參與主從同步。
普通表的 table_def_key = 庫名 + 表名。
臨時表的 table_def_key = 庫名 + 表名 + mysql實例 id + 線程 id。
內部臨時表
Mysql 的一些操作需要臨時存儲數據,會用到臨時表。比如 union 去重求交集。它將兩個子查詢的結果放入臨時表,去重之后返回客戶端。如果是 union all 求并集,就不需要臨時表。
group by 分組也用到臨時表。group by 分組默認排序,如果不需要排序,可以 sql 語句末尾添加 order by null
。
group by 無法判斷分組字段是否有序,因此用到臨時表。而索引是有序的,如果 group by 索引字段
就不會使用臨時表,省去排序時間。