मेरे पास लगभग 120k पंक्तियों वाली एक तालिका है, जिसमें एक बीएलओबी वाला क्षेत्र होता है (आकार में प्रत्येक प्रविष्टि में 1 एमबी से अधिक नहीं, आमतौर पर बहुत कम)। मेरी समस्या यह है कि जब भी मैं इस तालिका पर किसी भी कॉलम से पूछताछ करता हूं ( बीएलओबी एक सहित), यदि फाइल सिस्टम कैश खाली है, तो इसे पूरा करने में लगभग 40 'लगते हैं। उसी तालिका पर आने वाले सभी प्रश्नों को 1 से कम '(' कमांड लाइन क्लाइंट से परीक्षण, सर्वर पर ही) की आवश्यकता होती है। प्रश्नों में लौटाई गई पंक्तियों की संख्या एक खाली सेट से 60k +ब्लॉब युक्त टेबल पर mysql क्वेरी की गति फाइल सिस्टम कैश पर निर्भर करती है
मैंने क्वेरी कैश को समाप्त कर दिया है, इसलिए इसका इसके साथ कुछ लेना देना नहीं है। तालिका मायिसम है लेकिन मैंने इसे innodb (और ROW_FORMAT = COMPACT सेट करने) में बदलने की भी कोशिश की, लेकिन बिना किसी किस्मत के।
यदि मैं बीएलओबी कॉलम को हटा देता हूं, तो क्वेरी हमेशा तेज होती है।
तो मुझे लगता है कि सर्वर डिस्क (या उनमें से कुछ हिस्सों) से ब्लब्स पढ़ता है और फाइल सिस्टम उन्हें कैश करता है। समस्या यह है कि उच्च यातायात और सीमित स्मृति वाले सर्वर पर, फाइल सिस्टम कैश को थोड़ी देर में हर बार ताज़ा किया जाता है, इसलिए यह विशेष क्वेरी मुझे परेशानी पैदा करती है।
तो मेरा सवाल यह है कि, तालिका से ब्लॉब कॉलम को हटाए बिना चीजों को काफी तेज करने का कोई तरीका है?
mysql> SELECT ct.score FROM completed_tests ct where ct.status != 'deleted' and ct.status != 'failed' and score < 100;
Empty set (48.21 sec)
mysql> SELECT ct.score FROM completed_tests ct where ct.status != 'deleted' and ct.status != 'failed' and score < 99;
Empty set (1.16 sec)
mysql> explain SELECT ct.score FROM completed_tests ct where ct.status != 'deleted' and ct.status != 'failed' and score < 99;
+----+-------------+-------+-------+---------------+--------+---------+------+-------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------+--------+---------+------+-------+-------------+
| 1 | SIMPLE | ct | range | status,score | status | 768 | NULL | 82096 | Using where |
+----+-------------+-------+-------+---------------+--------+---------+------+-------+-------------+
1 row in set (0.00 sec)
mysql> show indexes from completed_tests;
+-----------------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+-----------------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| completed_tests | 0 | PRIMARY | 1 | id | A | 583938 | NULL | NULL | | BTREE | |
| completed_tests | 1 | users_login | 1 | users_LOGIN | A | 11449 | NULL | NULL | YES | BTREE | |
| completed_tests | 1 | tests_ID | 1 | tests_ID | A | 140 | NULL | NULL | | BTREE | |
| completed_tests | 1 | status | 1 | status | A | 3 | NULL | NULL | YES | BTREE | |
| completed_tests | 1 | timestamp | 1 | timestamp | A | 291969 | NULL | NULL | | BTREE | |
| completed_tests | 1 | archive | 1 | archive | A | 1 | NULL | NULL | | BTREE | |
| completed_tests | 1 | score | 1 | score | A | 783 | NULL | NULL | YES | BTREE | |
| completed_tests | 1 | pending | 1 | pending | A | 1 | NULL | NULL | | BTREE | |
+-----------------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
mysql> show create table completed_tests;
+-----------------+--------------------------------------
| Table | Create Table |
+-----------------+--------------------------------------
| completed_tests | CREATE TABLE `completed_tests` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`users_LOGIN` varchar(100) DEFAULT NULL,
`tests_ID` mediumint(8) unsigned NOT NULL DEFAULT '0',
`test` longblob,
`status` varchar(255) DEFAULT NULL,
`timestamp` int(10) unsigned NOT NULL DEFAULT '0',
`archive` tinyint(1) NOT NULL DEFAULT '0',
`time_start` int(10) unsigned DEFAULT NULL,
`time_end` int(10) unsigned DEFAULT NULL,
`time_spent` int(10) unsigned DEFAULT NULL,
`score` float DEFAULT NULL,
`pending` tinyint(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `users_login` (`users_LOGIN`),
KEY `tests_ID` (`tests_ID`),
KEY `status` (`status`),
KEY `timestamp` (`timestamp`),
KEY `archive` (`archive`),
KEY `score` (`score`),
KEY `pending` (`pending`)
) ENGINE=InnoDB AUTO_INCREMENT=117996 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED
1 row in set (0.00 sec)
मैं मूल रूप से mysql query slow at first fast afterwards पर इस पोस्ट, लेकिन मैं अब और अधिक जानकारी नहीं है तो मैं एक अलग रूप में repost:
यहाँ2 उदाहरण प्रश्न है, के साथ साथ समझाने, अनुक्रमित और तालिका परिभाषा, एक के बाद एक भाग गया सवाल मैं भी mysql forum पर इस पोस्ट, लेकिन मैं हमेशा
+1 अच्छी तरह से लिखित, पूर्ण प्रश्न। मुझे आशा है कि आपको एक अच्छा जवाब मिलेगा (मुझे नहीं मिला ':-) अगर आपको MySQL फोरम पर कोई जवाब मिलता है और कोई भी यहां जवाब नहीं देता है, तो कृपया उत्तर पोस्ट करें (नीचे दिए गए उत्तर के रूप में), आवश्यक 48 घंटों तक प्रतीक्षा करें, और फिर इसे स्वीकार करें । आपको अंक नहीं मिलेगा लेकिन यह इस विषय पर खोज करने वाले अन्य लोगों के लिए एक उत्तर प्रश्न के रूप में दिखाई देगा। सौभाग्य। –
"क्यों" भाग का जवाब नहीं दे सकता। मैं सुझाव दे सकता हूं कि आपको इसकी परवाह नहीं है। ठीक है, आप जानते हैं कि आपकी पहली क्वेरी धीमी है। तो क्या? जैसा कि मैंने समझा, कोई भी बाद के प्रश्न तेजी से हैं। तो यह जानकर कि इस तथ्य को जानने के लिए अपना आवेदन बनाएं। किसी बिंदु पर "वार्मअप" चरण जोड़ें, उदाहरण के लिए जब ग्राहक को लॉगिन फ़ॉर्म में अक्षर टाइप करना होगा। और इस तरह ... कैश सेटिंग्स के साथ खेलने से बेहतर है। –
और यहां एक उदाहरण दिया गया है कि Google एक ही समस्या को हल करता है, [http://code.google.com/appengine/docs/adminconsole/instances.html#Warmup_Requests ](http://code.google.com/appengine/docs/ adminconsole/instances.html # Warmup_Requests)। –