2011-09-26 14 views
18

MySQL में, जब आप एक अस्थायी तालिका बनाते हैं, उदाहरण के लिए "टेम्पलेट टेबल बनाएं ...", क्या वह तालिका मेमोरी या डिस्क पर बनाई गई है और आयोजित की गई है?मेमोरी या डिस्क पर "टेम्पलेट टेबल बनाएं" के साथ बनाई गई तालिकाएं हैं?

मैंने दस्तावेज़ों के माध्यम से पढ़ा है और Google ने इसे उत्तर दिया है और उत्तर के साथ नहीं आया है।

उत्तर

23

यह आपके द्वारा निर्दिष्ट इंजन पर निर्भर करता है। डिफ़ॉल्ट रूप से तालिका डेटा डिस्क पर संग्रहीत किया जाएगा। यदि आप मेमरी इंजन निर्दिष्ट करते हैं, तो डेटा केवल स्मृति में संग्रहीत किया जाएगा।

अस्थायी तालिकाओं के निर्माण के दौरान फाइल सिस्टम में बनाई गई फ़ाइलों को वास्तव में खोजना संभव होना चाहिए। निम्न कमांड चलाने के बाद:

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; 

मैं तो निर्देशिका जाँच: C: \ ProgramData \ MySQL \ MySQL सर्वर 5.5 \ डेटा \ परीक्षण (Windows पर) और फ़ाइलों को वर्तमान गया:

 
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. 

अस्थायी तालिकाओं को C: \ Windows \ Temp में संग्रहीत किया जाता है और असामान्य नाम होते हैं, लेकिन आंतरिक रूप से डेटा को उसी तरह से संग्रहीत किया जाता है।

 
#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

और यदि आप 'ब्लैकहोल' इंजन निर्दिष्ट करते हैं तो इसे विशेष डिवाइस में संग्रहीत किया जाएगा:/dev/null। – Johan

+2

ठीक है, उन्हें डिस्क पर 'temp_table_innodb' नहीं कहा जाएगा क्योंकि अस्थायी तालिका केवल एक कनेक्शन से पहुंच योग्य है, जैसे कि यदि आप डीबी में दो अलग कनेक्शन बनाते हैं और प्रत्येक के साथ एक अस्थायी तालिका बनाते हैं, तो आप उन्हें कॉल कर सकते हैं एक ही बात और वे एक-दूसरे के साथ टकराव नहीं करेंगे। सभी ने कहा, मुझे नहीं पता कि वे स्मृति में हैं या डिस्क पर हैं। मुझे लगता है, लेकिन मुझे कोई संदेह नहीं होगा कि गलत है, इसलिए मैं नहीं करूँगा। – Kenny

+0

@ केनी: मैंने उन्हें पाया ... अस्थायी फ़ोल्डर में (बिल्कुल!)। अद्यतन उत्तर देखें। –

4

मार्क की तरह, यह इस बात पर निर्भर करता है कि आप किस इंजन का उपयोग करने के लिए कहते हैं। यदि आप एक इंजन नहीं देते हैं, तो यह "कुछ" करेगा, लेकिन जरूरी नहीं कि इसे स्मृति में रखें। आप स्मृति में होने की मेज लिए बाध्य करना चाहते हैं, तो आप यह स्पष्ट रूप से परिभाषित करने के लिए है:

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

हालांकि, स्मृति-इंजन का उपयोग प्रतिबंधित है। अधिक जानकारी के लिए http://dev.mysql.com/doc/refman/5.5/en/internal-temporary-tables.html पर एक नज़र डालें।

+2

ध्यान दें कि (कम से कम MySQL 5.1.63) उपयोगकर्ता ने मेमोरी टेम्पल टेबल को अधिकतम_हेप_टेबल_साइज द्वारा सीमित किया है और आंतरिक अस्थायी तालिकाओं के विपरीत, ऑन-डिस्क अस्थायी तालिकाओं में कनवर्ट नहीं किया जाएगा यदि/जब वे बहुत बड़े हो जाते हैं। अधिक डेटा डालने से एक त्रुटि होगी। लिंक के ऊपर –

+2

आंतरिक अस्थायी तालिका (कुछ SQL क्वेरी निष्पादित करने के लिए जेनरेट किया गया) के लिए है, स्पष्ट अस्थायी तालिका के लिए नहीं। –