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 |
+-------------+-------------------+-----------+-----------+-------+-----------+