面試官: 知道MySQLde臨時(shí)表嗎?MySQL中還有臨時(shí)表?

點(diǎn)擊上方「藍(lán)字」關(guān)注我們
臨時(shí)表與內(nèi)存表并不是一致的。
內(nèi)存表
代表的使用Memory 引擎的表。在建立表的時(shí)候指定engine = memory .
臨時(shí)表
臨時(shí)表可以使用其他各種的引擎類型。比如我們所說的InnoDB.
為什么要使用臨時(shí)表呢?
為什么使用臨時(shí)表是由于這幾個(gè)特點(diǎn)。
臨時(shí)表只能被創(chuàng)建它的session所能看見與使用,對(duì)其他線程不可見。 臨時(shí)表與普通的表明可以相同,因?yàn)樵诖疟P上存儲(chǔ)的名字是不一樣的,內(nèi)存上顯示的也不一樣。 同一個(gè)session會(huì)話中,臨時(shí)表與普通表存在,增刪改查語(yǔ)句是訪問的臨時(shí)表。 show tables 不顯示臨時(shí)表。 session 結(jié)束后,臨時(shí)表會(huì)被刪除。
這樣的情景下,臨時(shí)表不擔(dān)心表重復(fù)的問題,并且不擔(dān)心數(shù)據(jù)刪除問題。臨時(shí)表有程序會(huì)自動(dòng)回收。
臨時(shí)表名重復(fù)
我們?cè)谇懊嫠f,臨時(shí)表屬于自己的session當(dāng)中的。
數(shù)據(jù)庫(kù)的表示怎么存儲(chǔ)在磁盤上的呢?普通表是放在普通表文件的目錄下,臨時(shí)表的存儲(chǔ)是放在另外一個(gè)tmp的文件目錄下。
臨時(shí)表的名字存在構(gòu)成也與臨時(shí)表不同,臨時(shí)表是在前綴的基礎(chǔ)上+線程id+順序的數(shù)字。
數(shù)據(jù)庫(kù)除了在磁盤上維護(hù)這個(gè)關(guān)系外,還需要在內(nèi)存上進(jìn)行維護(hù)。
普通表采用的table_def_key 是由庫(kù)名+表名 構(gòu)成。 臨時(shí)表采用的table_deg_key 是由庫(kù)名+表名+servier_id+thread_id.
臨時(shí)表與主備復(fù)制
雖然是臨時(shí)表,但是我們?cè)趧h除臨時(shí)表的時(shí)候也會(huì)在binlog 日志中記錄刪除命令。
這是為什么呢?
如果binlog 格式= stament/mixed 的時(shí)候,我們?cè)谥鲙?kù)中執(zhí)行創(chuàng)建臨時(shí)表,然后執(zhí)行操作。
以上內(nèi)容,如果不在binlog上記錄,在備庫(kù)上執(zhí)行就會(huì)出現(xiàn)臨時(shí)表丟失的問題。所以binlog在該模式下還是需要的。
那row模式呢?這是不需要的。在row模式下知識(shí)記錄操作邏輯,不會(huì)出現(xiàn)這個(gè)問題。
還有兩個(gè)個(gè)問題
執(zhí)行 drop table 表,會(huì)出現(xiàn)變形。
drop?table?'teble_name'?/*gengrated by server */??有這個(gè)代表進(jìn)行修改過。
這個(gè)命令是可以刪除多個(gè)表的,是row 格式的話 備庫(kù)上是沒有臨時(shí)表,所以需要語(yǔ)句的改寫 2. 主庫(kù)上不同線程創(chuàng)建的臨時(shí)表在備庫(kù)上怎么執(zhí)行?
備庫(kù)上的日志線程是共享的。在記錄binlog的時(shí)候會(huì)記錄每個(gè)語(yǔ)句主庫(kù)執(zhí)行的線程id。
在備庫(kù)上的table_def_Key 就是 庫(kù)名+表名+ 主庫(kù)上的server_id+thread_id. 另外一個(gè)線程操作也是類似的。
兩者最終的內(nèi)容還是不一樣的。
往期文章一覽

