मेरे पास एक 700GB InnoDB टेबल है जिसे मैं (केवल पढ़ने के लिए) कोई और डेटा नहीं लिख रहा हूं। मैं अपने पास मौजूद पुराने डेटा को हटाना चाहता हूं और उस डिस्क स्थान को पुनः प्राप्त करना चाहता हूं (जैसा कि मैं इससे बाहर चल रहा हूं)। डिलीट पार्ट बहुत आसान है, क्योंकि मेरे पास एक ऑटो-इंक प्राइमरी इंडेक्स है, इसलिए मैं इसे इस्तेमाल करने वाले चंक्स में केवल पुनरावृति कर सकता हूं, और पंक्तियों को हटा सकता हूं, लेकिन यह मुझे अंतरिक्ष में वापस नहीं लाएगा। मुझे लगता है OPTIMIZE TABLE
कि लेकिन यह एक 700GB मेज पर हमेशा के लिए ले जा सकता है, तो वहाँ एक और विकल्प मैं देख रहा हूँ?
RolandoMySQLDBA द्वारा संपादित करें
मान लें कि आपकी तालिका mydb.mytable
निम्न है , कृपया निम्न क्वेरी को चलाएँ और इसे यहाँ पोस्ट करें ताकि आप तालिका के सिकुड़ने के लिए आवश्यक डिस्कस्पेस निर्धारित कर सकें:
SELECT
FORMAT(dat/POWER(1024,3),2) datsize,
FORMAT(ndx/POWER(1024,3),2) ndxsize,
FORMAT((dat+ndx)/POWER(1024,3),2) tblsize
FROM (SELECT data_length dat,index_length ndx
FROM information_schema.tables WHERE
table_schema='mydb' AND table_name='mytable') A;
यदि आवश्यक हो, तो हमें तालिका संरचना को भी देखना होगा।
नोआम द्वारा संपादित
यह क्वेरी का आउटपुट है:
datsize ndxsize tblsize
682.51 47.57 730.08
यह तालिका संरचना है ( SHOW CREATE TABLE
)
`CREATE TABLE `mybigtable` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`uid` int(11) NOT NULL,
`created_at` datetime NOT NULL,
`tid` bigint(20) NOT NULL,
`text` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`ft` tinyint(1) NOT NULL,
`irtsd` bigint(20) NOT NULL,
`irtuid` int(11) NOT NULL,
`rc` int(11) NOT NULL,
`r` tinyint(1) NOT NULL,
`e` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, `timezone` varchar(5) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uid_tid` (`uid`,`tid`)) ENGINE=InnoDB AUTO_INCREMENT=2006963844 DEFAULT CHARSET=utf8`
ALTER TABLE ... ENGINE=InnoDB;
(यदि आपको ऐसा करने के लिए कमरा मिला है)। ज्यादातर अपने बहुत तेज SSD से संतुष्ट हैं और चिंता नहीं करेंगे।