2010-05-07 11 views
7

कैश कुंजी के हिस्से के रूप में अंतर्निहित तालिकाओं के अंतिम अद्यतन समय का उपयोग करते हुए, मुझे यादगार में डेटाबेस क्वेरी के (भारी) संसाधित परिणामों को संग्रहीत करने में सफलता मिली है। माईसाम टेबल के लिए, वह अंतिम बार बदला गया समय SHOW TABLE STATUS में उपलब्ध है। दुर्भाग्यवश, यह आमतौर पर इनो डीबी टेबल के लिए सामान्य है।मैं कैसे निर्धारित कर सकता हूं कि एक InnoDB तालिका आखिरी बार कब बदल दी गई थी?

MySQL 4.1 में, SHOW TABLE STATUS लाइन में एक InnoDB के लिए ctime आमतौर पर इसका वास्तविक अंतिम अपडेट समय था, लेकिन यह MySQL 5.1 के लिए सच नहीं प्रतीत होता है।

तालिका में एक डेटाटाइम फ़ील्ड है, लेकिन यह केवल तब दिखाता है जब एक पंक्ति संशोधित की जाती है - यह उस पंक्ति के हटाने का समय नहीं दिखा सकता है जो अब और नहीं है! तो, मैं वास्तव में MAX(update_time) का उपयोग नहीं कर सकता।

यहां वास्तव में मुश्किल हिस्सा है। मेरे पास कई प्रतिकृतियां हैं जिन्हें मैं पढ़ता हूं। क्या मैं उस तालिका की स्थिति को समझ सकता हूं जो वास्तव में लागू होने पर भरोसा नहीं करता है?

थोड़ी देर के लिए इस पर काम करने के बाद मेरा निष्कर्ष यह है कि यह जानकारी सस्ता रूप से प्राप्त करने के लिए संभव नहीं है। मैं संभवत: उस समय तक डेटा कैश करने जा रहा हूं जब तक कि तालिका को बदलने की उम्मीद न हो (यह दिन में एक बार अपडेट हो), और क्वेरी कैश को यह कहने में सहायता करें कि यह कहां कर सकता है।

उत्तर

8

यह MySQL bug 14374, 15438 है, और InnoDB bug 2681 अंतर्निहित है।

मेरे पास दो सुझाव हैं (MySQL पैच करने के अलावा)।

  1. यदि आप एक फ़ाइल प्रति फ़ाइल (innodb_file_per_table) का उपयोग कर रहे हैं, तो अंतर्निहित फ़ाइल को स्टेट करें। ऐसा करने के लिए आप एक MySQL फ़ंक्शन/एक्सटेंशन लिख सकते हैं। डेटाबेस कैशिंग के कारण यह थोड़ा सा अंतराल हो सकता है।
  2. आप अपनी तालिका के साथ अंतिम अद्यतन समय के साथ अपनी मेटाडेटा तालिका रखने के लिए ट्रिगर्स को अद्यतन, हटाएं और डालने के बाद उपयोग कर सकते हैं।

मैं व्यक्तिगत रूप से दूसरा सुझाव दूंगा, क्योंकि यह अधिक पोर्टेबल है और कार्यान्वयन विवरण (जैसे innodb_file_per_table) पर निर्भर नहीं है।

+2

मन में अगर 2.nd मार्ग जाने के बारे में InnoDB से चलाता रखें: "नोट वर्तमान में, कैस्केड विदेशी कुंजी क्रियाएं ट्रिगर्स को सक्रिय नहीं करती हैं।" ([13.2.2.5। विदेशी कुंजी प्रतिबंधों से] (http://dev.mysql.com/doc/refman/5.6/en/innodb-foreign-key-constraints.html)) –

11

तुम सच में रुचि रखते जब डेटाबेस बदल गया था नहीं कर रहे हैं, लेकिन पता करने के लिए मौसम या नहीं एक डेटाबेस तालिका में बदल गया था आप MySQL CHECKSUM TABLE में

आशा इस मदद करता है देखना चाहिए चाहते हैं।

+0

बहुत बढ़िया, बिल्कुल मुझे क्या चाहिए! – astgtciv

-1

मैं मेज पर एक और स्तंभ जोड़ने का सुझाव और MySQL जब तालिका पिछले संशोधित किया गया था का ट्रैक रखने, कुछ इस तरह करते हैं जाएगा:

ADD COLUMN `last_update` TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL 
+0

यह केवल तब दिखाता है जब एक विशिष्ट पंक्ति अपडेट की गई थी। जबकि आप "तालिका से चयन MAX (last_update)" कर सकते हैं, लेकिन यह हाल ही में संशोधित समय प्राप्त करने के लिए बड़ी संख्या में पंक्तियों वाली तालिका के लिए भारी मात्रा में ओवरहेड जोड़ सकता है –

संबंधित मुद्दे

 संबंधित मुद्दे