2011-09-26 20 views

cevap

23

Belirttiğiniz motora göre değişir. Varsayılan olarak, tablo verileri diskte saklanır. MEMORY motorunu belirtirseniz, veriler sadece bellekte saklanır.

Geçici tablolar oluşturulduğunda dosya sisteminde oluşturulan dosyaları gerçekten bulmak mümkün olmalıdır. aşağıdaki komutları çalıştırdıktan sonra:

CREATE TABLE test.table_myisam (x int) ENGINE=MyISAM; 
CREATE TABLE test.table_memory (x int) ENGINE=MEMORY; 
CREATE TEMPORARY TABLE test.temp_table_myisam (x int) ENGINE=MyISAM; 
CREATE TEMPORARY TABLE test.temp_table_memory (x int) ENGINE=MEMORY; 

Sonra belgelerini kontrol: C: Mevcut \ ProgramData \ MySQL \ MySQL (Windows üzerinde) Sunucu 5.5 \ data \ testi ve dosyaları edildi:

 
table_innodb.frm # Table definition. 
table_innodb.MYD # MyISAM table data file. 
table_innodb.MYI # MyISAM table index file. 

table_memory.frm # No MYD or MYI file for the MEMORY engine. 

Geçici tablolar C: \ Windows \ Temp'de saklanır ve sıra dışı isimlere sahiptir, ancak dahili olarak veriler aynı şekilde saklanır.

 
#sql9a0_7_d.frm # This is the MyISAM temporary table. 
#sql9a0_7_d.MYD # MyISAM data file for temporary table. 
#sql9a0_7_d.MYI # MyISAM index file for temporary table. 

#sql9a0_7_c.frm # This is the MEMORY engine file. No MYD or MYI. 
+4

Ve 'karadelik' motorunu belirtirseniz, özel aygıtta saklanır:/dev/null. – Johan

+2

Peki, geçici tabloya yalnızca bir bağlantı tarafından erişilebildiğinden, diskte 'temp_table_innodb' olarak adlandırılmayacaktır, çünkü db'ye iki ayrı bağlantı yaparsanız ve her biri ile geçici bir tablo yaparsanız, bunları çağırabilirsiniz. Aynı şey ve birbirleriyle çarpışmayacaklar. Bütün bunların, hafızada mı yoksa diskte mi olduğu hakkında hiçbir fikrim yok. Tahmin ederim, ama sanırım yanlış tahmin edemem, o yüzden yapmayacağım. – Kenny

+0

@Kenny: Onları temp klasöründe buldum (tabiki!). Güncellenmiş cevaba bakınız. –

4
Mark gibi, bunun MOTOR'ın ne amaçla kullanacağınıza bağlı olduğunu belirtti. Eğer bir MOTOR vermezseniz, "bir şey" yapar, ancak mutlaka hafızada tutmaz. Eğer bellekte olmak tabloyu zorlamak istiyorsanız, siz özellikle tanımlamak zorunda:

CREATE TEMPORARY TABLE foobar (id int) ENGINE=MEMORY; 

Ancak BELLEK-motor kullanımı sınırlıdır. Daha fazla bilgi için http://dev.mysql.com/doc/refman/5.5/en/internal-temporary-tables.html'a bir göz atın.

+2

(en az MySQL 5.1.63) kullanıcı tarafından oluşturulan bellek sıcaklığı tablolarının max_heap_table_size ile sınırlı olduğunu ve dahili temp tablolarının aksine, disket temp tablolarına dönüştürülmeyeceğini unutmayın. Çok büyürler. Daha fazla veri eklemek bir hatayla sonuçlanacaktır. –

+2

yukarıdaki bağlantı, geçici geçici tablo için değil iç geçici tablo (bazı sql sorgularını yürütmek için oluşturulur) içindir. –