2015-11-07 6 views
7

मैंने उन प्रक्रियाओं को संग्रहित किया है जो temp टेबल बनाते हैं। मैं फिर एक क्वेरी निष्पादित करना चाहता हूं जो इन temp तालिकाओं के साथ जुड़ता है।क्या गो में MySQL Temp टेबल्स का उपयोग करने का कोई तरीका है?

समस्या यह है कि Golang के डेटाबेस/एसक्यूएल डिजाइन के साथ, एक ही रास्ता आप बाद में प्रश्नों के लिए एक ही कनेक्शन एक सौदे बनाने के लिए है सुनिश्चित करने के लिए है।

मैं मुसीबत के लिए पूछ रहा है, तो मैं एक अस्थायी तालिका तक पहुँचने के उद्देश्य के लिए एक सौदे में मेरे चयन करता है के बहुमत लपेट हूँ? मैं समझता हूं कि मैं कुछ प्रदर्शन/स्केलेबिलिटी खो दूंगा क्योंकि मैं पूल से कनेक्शन पर कब्जा कर रहा हूं बल्कि उन्हें प्रश्नों के बीच वापस जाने की इजाजत देता हूं। लेकिन मुझे आश्चर्य है कि क्या मैं इस रणनीति के साथ लॉकिंग या अन्य गंभीर मुद्दों को देखना शुरू कर दूंगा।

कारण मैं इस वजह से मेरी टेबल से कई के लिए MySQL कार्य योजना लागू करके बहुत खराब है क्या करने की जरूरत (मैं कई कर रहा हूँ बड़े टेबल भर में मिलती है)। मैं इस मुद्दे से बचने के लिए कुछ मध्यवर्ती प्रश्नों को निष्पादित करना चाहता हूं और अपने परिणामों को temp तालिकाओं में संग्रहीत करना चाहता हूं।

+0

? गोलांग में अस्थायी सारणी का उपयोग करने का कोई तरीका नहीं है? – william

+0

दस्तावेज़ इंगित करते हैं कि एक temp तालिका बनाने से कोई अंतर्निहित प्रतिबद्धता नहीं होगी (https://dev.mysql.com/doc/refman/5.6/en/implicit-commit.html) हालांकि उनमें इंडेक्स जोड़ने का कोई तरीका नहीं है जैसा कि होगा – william

+0

MySQL में अस्थायी सारणी केवल वर्तमान कनेक्शन के लिए दृश्यमान हैं। एक बार यह कनेक्शन बंद हो जाने पर, उन्हें गिरा दिया जाता है। यदि आप अस्थायी तालिकाओं का उपयोग कर रहे हैं, तो आप अपना व्यवसाय करते समय उस कनेक्शन को पकड़ना होगा। – Code4aliving

उत्तर

4

आप अपनी खुद की छद्म अस्थायी सारणी बना सकते हैं जिन्हें एकाधिक प्रक्रियाओं और कनेक्शनों द्वारा एक्सेस किया जा सकता है।

विचार स्मृति मेमोरी बनाने, अपने परिचालन चलाने और बाद में सफाई करना है।

आप निम्न एसक्यूएल के साथ एक स्मृति टेबल बना सकते हैं;

CREATE TABLE mydb.temp_32rfd293 (
    id int(11) auto_increment, 
    content varchar(50), 
    PRIMARY KEY (`id`) 
) ENGINE=MEMORY; 

कुछ उपयोगी कार्य करें, तो यह का उपयोग कर छोड़;

DROP TABLE temp_32rfd293: 

अनुसूचित घटना mydb.temp_% तालिकाओं से अधिक उम्र के 1 दिन दूर करने के लिए

आप, आप क्या करना mysql में एक अनुसूचित घटना बना सकते हैं कभी परित्यक्त अस्थायी तालिका को साफ करना चाहते हैं इस। यदि आप ऐसा करने का विकल्प चुनते हैं तो आकस्मिक निकासी को रोकने के लिए अस्थायी तालिकाओं के लिए समर्पित स्कीमा का उपयोग करने पर विचार करें।

ध्यान दें: आप अपने my.ini में event_scheduler=ON जरूरत है इस काम करने के लिए।

DELIMITER $$ 

CREATE 
    EVENT `cleanup_custom_temps` 
    ON SCHEDULE EVERY 1 DAY STARTS '2000-01-01 01:00:00' 
    DO BEGIN 


    --------------------------------------------------- 
    -- Process to delete all tables with 
    -- prefix 'temp_', and older than 1 day 
    SET @tbls = (
    SELECT GROUP_CONCAT(TABLE_NAME) 
     FROM information_schema.TABLES 
     WHERE TABLE_SCHEMA = 'mydb' 
     AND TABLE_NAME LIKE 'temp_%' 
      AND CREATE_TIME < NOW() - INTERVAL 1 DAY 
); 
    SET @delStmt = CONCAT('DROP TABLE ', @tbls); 
    PREPARE stmt FROM @delStmt; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt; 
    --------------------------------------------------- 

    END */$$ 

DELIMITER ; 
यहां तक ​​कि अस्थायी तालिकाओं के लिए
संबंधित मुद्दे