मेरे पास एक सारणी है जिसमें एक टेबल के लिए एक विदेशी कुंजी है जो कुछ ब्लॉब डेटा स्टोर करती है। जब मैं मुख्य तालिका पर किसी शर्त के साथ टेबल पर एक आंतरिक जुड़ता हूं तो जॉइन प्रकार 'इंडेक्स' से 'ऑल' तक जाता है। मैं इसे टालना चाहूंगा क्योंकि मेरी ब्लॉब टेबल गीगाबाइट के दसियों के क्रम में है। मैं इससे कैसे बच सकता हूं?मैं इस मूल आंतरिक शामिल होने के साथ पूर्ण तालिका स्कैन से कैसे बचूं?
यहाँ बुनियादी भीतरी में शामिल होने है:
EXPLAIN SELECT m.id, b.id, b.data
FROM metadata m, blobstore b
WHERE m.fkBlob = b.id;
1, 'SIMPLE', 'm', 'index', 'fk_blob', 'fk_blob', '4', '', 1, 'Using index'
1, 'SIMPLE', 'b', 'eq_ref', 'PRIMARY', 'PRIMARY', '4', 'blob_index.m.fkBlob', 1, ''
यहाँ मैं मुख्य मेज पर एक शर्त जोड़:
EXPLAIN SELECT m.id, b.id, b.data
FROM metadata m, blobstore b
WHERE m.fkBlob = b.id AND m.start < '2009-01-01';
1, 'SIMPLE', 'b', 'ALL', 'PRIMARY', '', '', '', 1, ''
1, 'SIMPLE', 'm', 'ref', 'fk_blob,index_start', 'fk_blob', '4', 'blob_index.b.id', 1, 'Using where'
सूचना है कि जिस क्रम में टेबल में सूचीबद्ध हैं बदल गया है। यह मुख्य तालिका के बारे में मैंने जो शर्त जोड़ा है, उसके कारण अब ब्लॉब टेबल पर एक पूर्ण टेबल स्कैन कर रहा है।
DROP TABLE IF EXISTS `blob_index`.`metadata`;
CREATE TABLE `blob_index`.`metadata` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`fkBlob` int(10) unsigned NOT NULL,
`start` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `fk_blob` (`fkBlob`),
KEY `index_start` (`start`),
CONSTRAINT `fk_blob` FOREIGN KEY (`fkBlob`) REFERENCES `blobstore` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
DROP TABLE IF EXISTS `blob_index`.`blobstore`;
CREATE TABLE `blob_index`.`blobstore` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`data` mediumblob NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
आपका अधिकार, मैंने वहां कुछ डेटा फेंक दिया, दोनों टेबलों पर तालिका का विश्लेषण किया, और अब पहली बार मेटा टेबल पर टाइप रेंज का है। – Fredrick