Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

Innodb का SHOW TABLE STATUS इतना अविश्वसनीय क्यों है?

आधिकारिक MySQL 5.1 दस्तावेज़ीकरण स्वीकार करता है कि InnoDB SHOW TABLE STATUS के साथ सटीक आंकड़े नहीं देता है . जबकि MYISAM टेबल विशेष रूप से मेटा-डेटा का एक आंतरिक कैश रखते हैं जैसे कि पंक्तियों की संख्या आदि, InnoDB इंजन टेबल डेटा और इंडेक्स दोनों को */var/lib/mysql/ibdata**

में स्टोर करता है।

InnoDB के पास पंक्ति संख्याओं की त्वरित क्वेरी की अनुमति देने वाली कोई समीचीन अनुक्रमणिका फ़ाइल नहीं है।

असंगत तालिका पंक्ति संख्या SHOW TABLE STATUS द्वारा रिपोर्ट की जाती हैं क्योंकि InnoDB तालिका डेटा (*/var/lib/mysql/ibdata** में) की एक श्रेणी का नमूना लेकर 'पंक्तियों' मान का गतिशील रूप से अनुमान लगाता है और फिर पंक्तियों की अनुमानित संख्या को एक्सट्रपलेशन करता है। इतना ही नहीं InnoDB दस्तावेज़ SHOW TABLE STATUS का उपयोग करते समय पंक्ति संख्या की अशुद्धि को 50% तक स्वीकार करता है।

MySQL दस्तावेज़ लगातार पंक्ति संख्या क्वेरी प्राप्त करने के लिए MySQL क्वेरी कैश का उपयोग करने का सुझाव देते हैं, लेकिन दस्तावेज़ कैसे निर्दिष्ट नहीं करते हैं . यह कैसे किया जा सकता है इसकी एक संक्षिप्त व्याख्या इस प्रकार है।

सबसे पहले, जांचें कि क्वेरी कैशिंग सक्षम है:

mysql> SHOW VARIABLES LIKE 'have_query_cache';

अगर have_query_cache . का मान है नहीं फिर /etc/my.cnf . में निम्न पंक्तियों को जोड़कर क्वेरी कैश को सक्षम करें और फिर mysqld को पुनरारंभ करें।

have_query_cache=1    # added 2017 08 24 wh
query_cache_size  = 1048576
query_cache_type  = 1
query_cache_limit = 1048576

(अधिक जानकारी के लिए देखें http://dev.mysql. com/doc/refman/5.1/hi/query-cache.html )

कैश की सामग्री को क्वेरी करें

mysql> SHOW STATUS LIKE 'Qcache%';

अब SQL_CALC_FOUND_ROWS का उपयोग करें SELECT . में स्टेटमेंट क्वेरी:

SELECT SQL_CALC_FOUND_ROWS COUNT(*) FROM my_innodb_table

SQL_CALC_FOUND_ROWS कैश से पढ़ने का प्रयास करेगा और, यदि यह क्वेरी नहीं मिलती है, तो निर्दिष्ट तालिका के विरुद्ध क्वेरी निष्पादित करें और फिर क्वेरी कैश में तालिका पंक्तियों की संख्या को प्रतिबद्ध करें। उपरोक्त क्वेरी के अतिरिक्त निष्पादन (या अन्य 'कैशेबल' SELECT कथन - नीचे देखें) कैश से परामर्श करेगा और सही परिणाम लौटाएगा।

बाद में 'cachable' SELECT प्रश्न - भले ही वे LIMIT . हों परिणाम - क्वेरी कैश से परामर्श करेगा और आपको

के साथ कुल तालिका पंक्ति संख्या (केवल एक बार बंद) प्राप्त करने की अनुमति देगा
SELECT FOUND_ROWS();

जो पिछली कैश्ड क्वेरी की सही तालिका पंक्ति कुल लौटाता है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL की छिपी विशेषताएं

  2. #1214 - प्रयुक्त तालिका प्रकार FULLTEXT अनुक्रमणिका का समर्थन नहीं करता

  3. Mysql में सिंक्रनाइज़ संग्रहीत कार्यविधि निष्पादन

  4. मैसकल टेबल में डुप्लीकेट रिकॉर्ड्स की गणना करें?

  5. एक MySQL डेटाबेस से एक पंक्ति से एक कॉलम पढ़ें