MySQL में टेबल के डेटा साइज़ और इंडेक्स साइज़ का अनुमान / भविष्यवाणी कैसे करें


26

मुझे पता है कि टेबल के आकार का अनुमान लगाने का सबसे अच्छा तरीका क्या है क्योंकि मैंने बहुत सारे ब्लॉग और फ़ोरम का अध्ययन किया है लेकिन कुछ सटीक उत्तर खोजने में असमर्थ है

एक उदाहरण के लिए हमारे पास एक टेबल सिटी है जिसमें InnoDB इंजन है , जो भविष्य में (अगले 1 साल में) यह बताता है कि 1 मिलियन रिकॉर्ड होंगे इसलिए इस अवधि में उस तालिका का अनुमानित डेटा आकार और सूचकांक आकार क्या होगा।

mysql> desc City;
+-------------+----------+------+-----+---------+----------------+
| Field       | Type     | Null | Key | Default | Extra          |
+-------------+----------+------+-----+---------+----------------+
| ID          | int(11)  | NO   | PRI | NULL    | auto_increment |
| Name        | char(35) | NO   |     |         |                |
| CountryCode | char(3)  | NO   | MUL |         |                |
| District    | char(20) | NO   |     |         |                |
| Population  | int(11)  | NO   |     | 0       |                |
+-------------+----------+------+-----+---------+----------------+
5 rows in set (0.03 sec)

अद्यतन करें

1 मिलियन रिकॉर्ड के साथ अनुमानित ऊपरी बाउंड (तालिका का अधिकतम आकार) क्या होगा और हम इसका अनुमान कैसे लगा सकते हैं।


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

जवाबों:


51

तालिका विवरण को देखते हुए, मैं देखता हूं

  • 66 बाइट्स प्रति पंक्ति डेटा
  • प्राथमिक कुंजी के लिए प्रति पंक्ति 4 बाइट्स
  • देश कोड इंडेक्स के लिए प्रति पंक्ति 7 बाइट्स
    • देश के लिए 3 बाइट्स
    • देश कोड से जुड़ी क्लस्टर कुंजी के लिए 4 बाइट्स
  • डेटा और कुंजियों के कुल 77 बाइट्स
  • यह BTREE या Tablespace Fragmentation के लिए हाउसकीपिंग को फैक्टरिंग नहीं करता है

एक लाख पंक्तियों के लिए, 77,000,000 बाइट्स (73.43 एमबी)

तालिका को मापने के लिए, दी गई तालिका mydb.mytable के लिए, आप इस क्वेरी को चला सकते हैं

SELECT 
    CONCAT(FORMAT(DAT/POWER(1024,pw1),2),' ',SUBSTR(units,pw1*2+1,2)) DATSIZE,
    CONCAT(FORMAT(NDX/POWER(1024,pw2),2),' ',SUBSTR(units,pw2*2+1,2)) NDXSIZE,
    CONCAT(FORMAT(TBL/POWER(1024,pw3),2),' ',SUBSTR(units,pw3*2+1,2)) TBLSIZE
FROM
(
    SELECT DAT,NDX,TBL,IF(px>4,4,px) pw1,IF(py>4,4,py) pw2,IF(pz>4,4,pz) pw3
    FROM 
    (
        SELECT data_length DAT,index_length NDX,data_length+index_length TBL,
        FLOOR(LOG(IF(data_length=0,1,data_length))/LOG(1024)) px,
        FLOOR(LOG(IF(index_length=0,1,index_length))/LOG(1024)) py,
        FLOOR(LOG(data_length+index_length)/LOG(1024)) pz
        FROM information_schema.tables
        WHERE table_schema='mydb'
        AND table_name='mytable'
    ) AA
) A,(SELECT 'B KBMBGBTB' units) B;

डेटाबेस और स्टोरेज इंजन द्वारा समूहीकृत सभी तालिकाओं को मापने के लिए

SELECT
    IF(ISNULL(DB)+ISNULL(ENGINE)=2,'Database Total',
    CONCAT(DB,' ',IFNULL(ENGINE,'Total'))) "Reported Statistic",
    LPAD(CONCAT(FORMAT(DAT/POWER(1024,pw1),2),' ',
    SUBSTR(units,pw1*2+1,2)),17,' ') "Data Size",
    LPAD(CONCAT(FORMAT(NDX/POWER(1024,pw2),2),' ',
    SUBSTR(units,pw2*2+1,2)),17,' ') "Index Size",
    LPAD(CONCAT(FORMAT(TBL/POWER(1024,pw3),2),' ',
    SUBSTR(units,pw3*2+1,2)),17,' ') "Total Size"
FROM
(
    SELECT DB,ENGINE,DAT,NDX,TBL,
    IF(px>4,4,px) pw1,IF(py>4,4,py) pw2,IF(pz>4,4,pz) pw3
    FROM 
    (SELECT *,
        FLOOR(LOG(IF(DAT=0,1,DAT))/LOG(1024)) px,
        FLOOR(LOG(IF(NDX=0,1,NDX))/LOG(1024)) py,
        FLOOR(LOG(IF(TBL=0,1,TBL))/LOG(1024)) pz
    FROM
    (SELECT
        DB,ENGINE,
        SUM(data_length) DAT,
        SUM(index_length) NDX,
        SUM(data_length+index_length) TBL
    FROM
    (
       SELECT table_schema DB,ENGINE,data_length,index_length FROM
       information_schema.tables WHERE table_schema NOT IN
       ('information_schema','performance_schema','mysql')
       AND ENGINE IS NOT NULL
    ) AAA GROUP BY DB,ENGINE WITH ROLLUP
) AAA) AA) A,(SELECT ' BKBMBGBTB' units) B;

इन क्वेरी को चलाएं और आप डेटाबेस / इंजन डिस्क उपयोग में परिवर्तन ट्रैक कर सकते हैं।

कोशिश तो करो !!!


1
यह आपके सभी तालिका आकारों को देखने के लिए वास्तव में एक शानदार क्वेरी है।
घीस

CHARलंबाई अगर आपके पास 3 से गुणा करने की आवश्यकता है CHARSET utf8। संपूर्ण ओवरहेड का अनुमान गणना को दोगुना या तिगुना करके किया जा सकता है।
रिक जेम्स

@RolandoMySQLDBA, क्या आप जानते हैं कि वास्तविक आकार (कंप्रेस्ड टेबल) के साथ तुलना करने और सेक का अनुपात प्राप्त करने के उद्देश्य से किसी तालिका की "वास्तविक" पंक्ति आकार की गणना करना संभव है?
Ceinmart

@ceinmart innodb_page_size तय हो गई है (डिफ़ॉल्ट रूप से 16K या 16384) और वह सीमा बन जाती है जहां पंक्तियां और समूह या विभाजन होता है। Innodb_page_size को बदलने से अच्छे या बुरे के लिए डेटा का भंडारण बदल सकता है। किसी भी पंक्ति को कैसे भरा या विरल किया जाता है (विशेषकर TEXT / BLOB / VARCHAR की उपस्थिति के साथ)। सबसे अच्छे रूप में, आपको एक अनुपात का अनुमान लगाने के लिए स्कीमा रिपोर्ट के लिए .ibd फ़ाइल के आकार की तुलना करनी चाहिए। आपको ALTER TABLE ... ENGINE=InnoDB;एक सटीक अनुपात प्राप्त करने के लिए एक NULL ALTER TABLE ( ) भी करने की आवश्यकता हो सकती है। प्रयास इसके लायक नहीं हो सकता है।
रोलैंडमाइसीडीडीबीए

@ceinmart ध्यान रखें टोपी बदलते समय innodb_page_size टेबल-बाय-टेबल सेटिंग नहीं है। आपको डेटा का पूर्ण निर्यात करने की आवश्यकता होगी (देखें mariadb.com/kb/en/library/how-to-change-innodb_page_size )
RolandoMySQLDBA

4

यदि आप InnoDB तालिकाओं का उपयोग कर रहे हैं, तो आप डेटा / व्यक्तिगत अनुक्रमित से आकार प्राप्त कर सकते हैं mysql.innodb_index_stats। 'आकार' स्टेट में पृष्ठों में उत्तर होता है, इसलिए आपको इसे पृष्ठ-आकार से गुणा करना होगा, जो कि डिफ़ॉल्ट रूप से 16K है

select database_name, table_name, index_name, stat_value*@@innodb_page_size
from mysql.innodb_index_stats where stat_name='size';

सूचकांक PRIMARY ही डेटा है।


1
यह मानता है कि आपके पास तालिका में डेटा है; ऐसा लगता है कि ओपी आबादी करने से पहले अनुमान लगाना चाहता है।
रिक जेम्स

0
SELECT  Table_NAME "tablename",
           data_length   "table data_length in Bytes",
           index_length  "table index_length in Bytes",
           data_free  "Free Space in Bytes"
    FROM  information_schema.TABLES  where  Table_schema = 'databasename';

इस क्वेरी आप के लिए इस्तेमाल किया आकार प्राप्त कर सकते हैं को क्रियान्वित करते हुए Dataऔर Indexएक मेज की, आप पंक्तियों की # खिलाफ इस आकार की जांच और 1 लाख पंक्तियों के लिए भविष्यवाणी कर सकते हैं


1
मुझे यकीन नहीं है लेकिन क्या यह कुछ सटीक परिणाम देगा? क्या आपने कभी इसका परीक्षण किया है?
अब्दुल मनाफ

वास्तव में मैं इस क्वेरी परिणाम को समय-समय पर विकास (%) wrt आकार देखने के लिए परीक्षण कर रहा हूं
पीटर वेंडरबर्ग

0

यदि आपके पास अभी तक डेटा नहीं है, तो यहां कुछ सुझाव दिए गए हैं। निम्नलिखित InnoDB पर लागू होता है। (MyISAM बहुत सरल है, और छोटा है।)

CHARचर-लंबाई वाले कॉलम के लिए उपयोग न करें । CHARACTER SETआप क्या उपयोग कर रहे हैं? अससी को प्रति चरित्र एक बाइट की आवश्यकता है; utf8mb4 की जरूरत 1 से 4 के बीच है।

4 bytes per INT
35 for CHAR(35), if ascii or latin1; varchar is probably less
3 for the country code; it is fixed length
etc

कुल = लगभग 80 बाइट्स।

विभिन्न ओवरहेड्स के लिए खाते को 2 और 3 के बीच 80 से गुणा करें। सबसे अधिक संभावना है कि 1 एम पंक्ति तालिका 160 एमबी और 240 एमबी के बीच होगी।

एकल CountryCodeबाइट को मापने के लिए, 3 बाइट्स के लिए:

3 bytes data
4 bytes for the PK (implicitly included with any secondary key)
25 bytes basic overhead
32 total
times 1.5 -- overhead for BTree that was randomly inserted into
48MB -- total for 1M rows.

टिप्पणियाँ:

  • केवल पत्ती के नोड्स (बीट्र्स के) की गणना करने की आवश्यकता है; गैर-पत्ती नोड्स के लिए ओवरहेड आमतौर पर 1% है।

  • PRIMARY KEY"क्लस्टर" है डेटा के साथ है, इसलिए यह गणना करने के लिए कोई जरूरत नहीं है।

  • यदि आपके पास एक स्पष्ट पीके नहीं है, तो आपको गढ़े हुए पीके की अनुमति देने के लिए पंक्ति आकार में 6 बाइट्स जोड़ने की आवश्यकता है।

  • ROW_FORMAT = COMPRESSEDआपको लगभग 2: 1 सिकुड़न देता है। (यह विशिष्ट ज़िप (आदि) 3: 1 की संपीड़न दर जितना अच्छा नहीं है।)

  • SHOW TABLE STATUS LIKE "tablename";'वास्तविक' आकार की गणना करने का त्वरित तरीका है। Data_lengthडेटा और पीके के लिए देखें ; Index_lengthद्वितीयक सूचकांक के लिए, और Data_freeकुछ अन्य सामान के लिए।

  • इससे Index_lengthअधिक होना दुर्लभ है Data_length। हालाँकि ऐसा होना "गलत" नहीं है।


-1

यह थकाऊ है। लेकिन विवरण डॉक्स में हैं

जितना संभव हो उतना सटीक होने के लिए, जो शायद ही कभी आवश्यक है, आपको तालिका संरचना और सूचकांक संरचना के बारे में भी पढ़ना होगा।

अगर मैं आपके जूते में होता, तो मैं टेबल का निर्माण करता, इसे टेस्ट डेटा की एक लाख पंक्तियों के साथ आबाद करता और आकार में बदलाव को मापता। आपके आवेदन के आधार पर, आपको लेन-देन लॉग फ़ाइलों का आकार भी ध्यान में रखना होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.