मैं एक गोदाम मेज है कि इस तरह दिखता है: एक के लिएअतिरिक्त स्तंभ खंडहर MySQL प्रदर्शन
CREATE TABLE Warehouse (
id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
eventId BIGINT(20) UNSIGNED NOT NULL,
groupId BIGINT(20) NOT NULL,
activityId BIGINT(20) UNSIGNED NOT NULL,
... many more ids,
"txtProperty1" VARCHAR(255),
"txtProperty2" VARCHAR(255),
"txtProperty3" VARCHAR(255),
"txtProperty4" VARCHAR(255),
"txtProperty5" VARCHAR(255),
... many more of these
PRIMARY KEY ("id")
KEY "WInvestmentDetail_idx01" ("groupId"),
... several more indices
) ENGINE=INNODB;
अब, निम्न क्वेरी 0.8s के बारे में क्वेरी समय और 0.2s में में खर्च करता है समय लाने, लगभग एक सेकंड की कुल। क्वेरी ~ 67,000 पंक्तियां लौटाती है।
SELECT eventId
FROM Warehouse
WHERE accountId IN (10, 8, 13, 9, 7, 6, 12, 11)
AND scenarioId IS NULL
AND insertDate BETWEEN DATE '2002-01-01' AND DATE '2011-12-31'
ORDER BY insertDate;
चुनिंदा खंड में अधिक आईडी जोड़ना वास्तव में प्रदर्शन को बिल्कुल नहीं बदलता है।
SELECT eventId, groupId, activityId, insertDate
FROM Warehouse
WHERE accountId IN (10, 8, 13, 9, 7, 6, 12, 11)
AND scenarioId IS NULL
AND insertDate BETWEEN DATE '2002-01-01' AND DATE '2011-12-31'
ORDER BY insertDate;
हालांकि, "संपत्ति" कॉलम जोड़ने से यह 0.6s समय और 1.8 प्रश्न पूछताछ में बदल जाता है।
SELECT eventId, txtProperty1
FROM Warehouse
WHERE accountId IN (10, 8, 13, 9, 7, 6, 12, 11)
AND scenarioId IS NULL
AND insertDate BETWEEN DATE '2002-01-01' AND DATE '2011-12-31'
ORDER BY insertDate;
अब वास्तव में अपने मोजे बंद करने के लिए। txtProperty1 के बजाय, txtProperty2 का उपयोग करते समय 0.8s लाने के लिए समय बदलता है, 24s क्वेरी!
SELECT eventId, txtProperty2
FROM Warehouse
WHERE accountId IN (10, 8, 13, 9, 7, 6, 12, 11)
AND scenarioId IS NULL
AND insertDate BETWEEN DATE '2002-01-01' AND DATE '2011-12-31'
ORDER BY insertDate;
दो कॉलम काफी डेटा के प्रकार में समान वे पकड़ रहे हैं: ज्यादातर गैर-शून्य, और न तो इंडेक्स किए गए (नहीं है कि कि एक फर्क वैसे भी करना चाहिए)। यह सुनिश्चित करने के लिए कि तालिका स्वयं स्वस्थ है, मैंने इसके खिलाफ विश्लेषण/अनुकूलित किया।
यह वास्तव में मेरे लिए रहस्यमय है। मैं देख सकता हूं कि चुनिंदा खंड में कॉलम जोड़ने से केवल थोड़ी देर में वृद्धि हो सकती है, लेकिन इसे क्वेरी समय नहीं बदलना चाहिए, खासकर महत्वपूर्ण नहीं। इस मंदी के कारण होने के कारण मैं किसी भी विचार की सराहना करता हूं।
संपादित करें - अधिक डेटा बिंदुओं
चुनें * वास्तव में txtProperty2 से बेहतर साबित - 0.8s क्वेरी, 8.4s लाने। बहुत बुरा मैं इसका उपयोग नहीं कर सकता क्योंकि fetch time (अपेक्षित) बहुत लंबा है।
इन समय कितने दोहराने योग्य थे? –
और न ही अनुक्रमित किया गया है (ऐसा नहीं है कि इससे कोई फर्क पड़ता है) .... यह हो सकता है (http://en.wikipedia.org/wiki/Index_%28database%29#Covering_Index) –
@ रोवलैंड - हाँ, मेरे पास है दो देव लैपटॉप और एक क्यूए सर्वर पर समय दोहराया। जाहिर है, सर्वर तेज है, लेकिन पैटर्न बनी हुई है। –