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

क्या InnoDB में सूचकांक आकार का अनुमान लगाने का कोई सूत्र है?

InnoDB में, PRIMARY KEY डेटा के साथ एम्बेड किया गया है, इसलिए आप इसे खाली जगह लेने के बारे में सोच सकते हैं।

द्वितीयक कुंजी के लिए... MyISAM सूत्र लें, लेकिन दोनों . के कॉलम शामिल करें द्वितीयक कुंजी और PRIMARY KEY . फिर 3 से गुणा करें। (बहुत अधिक ओवरहेड है।) फिर भी, उत्तर किसी भी दिशा में 2 के कारक से अलग हो सकता है।

ध्यान दें कि यदि आपके पास बहुत सी द्वितीयक कुंजियाँ हैं, तो PK का आकार तालिका+इंडेक्स के लिए समग्र स्थान में एक बड़ा अंतर डालता है।

उदाहरण

SET @db = 'world', @tbl = 'cities';
    SELECT      n_rows AS 'Approx Rows',
                'Data & PK' AS 'Type',
                clustered_index_size * 16384 AS Bytes,
                ROUND(clustered_index_size * 16384 / n_rows) AS 'Bytes/row',
                clustered_index_size AS Pages,
                ROUND(n_rows / clustered_index_size) AS 'Rows/page'
        FROM mysql.innodb_table_stats
        WHERE database_name = @db
          AND table_name = @tbl
    UNION
        SELECT  n_rows,
                'Secondary Indexes' AS 'BTrees',
                sum_of_other_index_sizes * 16384 AS Bytes,
                ROUND(sum_of_other_index_sizes * 16384 / n_rows) AS 'Bytes/row',
                sum_of_other_index_sizes AS Pages,
                ROUND(n_rows / sum_of_other_index_sizes) AS 'Rows/page'
        FROM mysql.innodb_table_stats
        WHERE database_name = @db
          AND table_name = @tbl
          AND sum_of_other_index_sizes > 0
          ;
-- (Percona has a different way.)

आउटपुट:

+-------------+-------------------+-----------+-----------+-------+-----------+
| Approx Rows | Type              | Bytes     | Bytes/row | Pages | Rows/page |
+-------------+-------------------+-----------+-----------+-------+-----------+
|     2637973 | Data & PK         | 179077120 |        68 | 10930 |       241 |
|     2637973 | Secondary Indexes | 232341504 |        88 | 14181 |       186 |
+-------------+-------------------+-----------+-----------+-------+-----------+

टेबल में दो इंडेक्स होते हैं:

PRIMARY KEY(...)  -- 14 bytes
INDEX(state, population)
INDEX(state, city)
  state CHAR(2) CHARACTER SET ascii -- 2 bytes
  population INT UNSIGNED -- 4 bytes
  city  -- AVG(LENGTH(city)) = 1+9.07 bytes

COUNT(*): 2,699,354  (the InnoDB estimate was not too far from this)

First index:  20    bytes * 2.7M rows = 54MB
Second index: 26.07 bytes * 2.7M rows = 70MB
Total:  124MB
Actual: 232MB
Ratio: 1.9x  (note: I skipped the "/0.67")

बस एक और बात साबित करने के लिए, मैंने OPTIMIZE TABLE . की कोशिश की . उसके बाद के आँकड़े अनिवार्य रूप से वही थे:

+-------------+-------------------+-----------+-----------+-------+-----------+
| Approx Rows | Type              | Bytes     | Bytes/row | Pages | Rows/page |
+-------------+-------------------+-----------+-----------+-------+-----------+
|     2685828 | Data & PK         | 179077120 |        67 | 10930 |       246 |
|     2685828 | Secondary Indexes | 232341504 |        87 | 14181 |       189 |
+-------------+-------------------+-----------+-----------+-------+-----------+


  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 group_concat के बराबर प्रेस्टो

  2. त्रुटि 1044 (42000):उपयोगकर्ता ''@'लोकलहोस्ट' के लिए डेटाबेस 'डीबी' तक पहुंच अस्वीकृत

  3. क्या किसी ने पाया है कि REGEX \b MYSQL में काम नहीं करता है?

  4. MySQL डेटाबेस में सभी तालिकाओं के लिए रिकॉर्ड गणना प्राप्त करें

  5. Easy_install MySQLdb क्यों नहीं ढूंढ सकता?