समस्या:
हमारे पास एक सामाजिक साइट है जहां सदस्य एक दूसरे को अनुकूलता या मिलान के लिए रेट कर सकते हैं। इस user_match_ratings
तालिका में 220 मिलियन से अधिक पंक्तियाँ (9 गिग डेटा या लगभग 20 गिग इंडेक्स में) हैं। इस तालिका के विरुद्ध क्वेरीज़ धीमे-धीमे (थ्रेसहोल्ड> 2 सेकंड) में दिखाई देती हैं और सिस्टम में सबसे अधिक बार लॉग की जाने वाली धीमी क्वेरी है:
Query_time: 3 Lock_time: 0 Rows_sent: 3 Rows_examined: 1051
"select rating, count(*) as tally from user_match_ratings where rated_user_id = 395357 group by rating;"
Query_time: 4 Lock_time: 0 Rows_sent: 3 Rows_examined: 1294
"select rating, count(*) as tally from user_match_ratings where rated_user_id = 4182969 group by rating;"
Query_time: 3 Lock_time: 0 Rows_sent: 3 Rows_examined: 446
"select rating, count(*) as tally from user_match_ratings where rated_user_id = 630148 group by rating;"
Query_time: 5 Lock_time: 0 Rows_sent: 3 Rows_examined: 3788
"select rating, count(*) as tally from user_match_ratings where rated_user_id = 1835698 group by rating;"
Query_time: 17 Lock_time: 0 Rows_sent: 3 Rows_examined: 4311
"select rating, count(*) as tally from user_match_ratings where rated_user_id = 1269322 group by rating;"
MySQL संस्करण:
- प्रोटोकॉल संस्करण: १०
- संस्करण: 5.0.77-लॉग
- संस्करण bdb: स्लीपेकैट सॉफ्टवेयर: बर्कले DB 4.1.24: (29 जनवरी, 2009)
- संस्करण संकलन मशीन: x86_64 version_compile_os: redhat-linux-gnu
तालिका जानकारी:
SHOW COLUMNS FROM user_match_ratings;
देता है:
╔═══════════════╦════════════╦════╦═════╦════════╦════════════════╗
║ id ║ int(11) ║ NO ║ PRI ║ NULL ║ auto_increment ║
║ rater_user_id ║ int(11) ║ NO ║ MUL ║ NULL ║ ║
║ rated_user_id ║ int(11) ║ NO ║ MUL ║ NULL ║ ║
║ rating ║ varchar(1) ║ NO ║ ║ NULL ║ ║
║ created_at ║ datetime ║ NO ║ ║ NULL ║ ║
╚═══════════════╩════════════╩════╩═════╩════════╩════════════════╝
नमूना प्रश्न:
select * from mutual_match_ratings where id=221673540;
देता है:
╔═══════════╦═══════════════╦═══════════════╦════════╦══════════════════════╗
║ id ║ rater_user_id ║ rated_user_id ║ rating ║ created_at ║
╠═══════════╬═══════════════╬═══════════════╬════════╬══════════════════════╣
║ 221673540 ║ 5699713 ║ 3890950 ║ N ║ 2013-04-09 13:00:38 ║
╚═══════════╩═══════════════╩═══════════════╩════════╩══════════════════════╝
इंडेक्स
तालिका में 3 सूचकांक हैं:
- पर एकल सूचकांक
rated_user_id
- पर समग्र सूचकांक
rater_user_id
औरcreated_at
- पर समग्र सूचकांक
rated_user_id
औरrater_user_id
user_match_ratings से सूचकांक दिखाएं;
देता है:
╔════════════════════╦════════════╦═══════════════════════════╦══════════════╦═══════════════╦═══════════╦═════════════╦══════════╦════════╦═════════════════════════╦════════════╦══════════════════╗
║ Table ║ Non_unique ║ Key_name ║ Seq_in_index ║ Column_name ║ Collation ║ Cardinality ║ Sub_part ║ Packed ║ Null ║ Index_type ║ Comment ║
╠════════════════════╬════════════╬═══════════════════════════╬══════════════╬═══════════════╬═══════════╬═════════════╬══════════╬════════╬═════════════════════════╬════════════╬══════════════════╣
║ user_match_ratings ║ 0 ║ PRIMARY ║ 1 ║ id ║ A ║ 220781193 ║ NULL ║ NULL ║ BTREE ║ ║ ║
║ user_match_ratings ║ 1 ║ user_match_ratings_index1 ║ 1 ║ rater_user_id ║ A ║ 11039059 ║ NULL ║ NULL ║ BTREE ║ ║ ║
║ user_match_ratings ║ 1 ║ user_match_ratings_index1 ║ 2 ║ created_at ║ A ║ 220781193 ║ NULL ║ NULL ║ BTREE ║ ║ ║
║ user_match_ratings ║ 1 ║ user_match_ratings_index2 ║ 1 ║ rated_user_id ║ A ║ 4014203 ║ NULL ║ NULL ║ BTREE ║ ║ ║
║ user_match_ratings ║ 1 ║ user_match_ratings_index2 ║ 2 ║ rater_user_id ║ A ║ 220781193 ║ NULL ║ NULL ║ BTREE ║ ║ ║
║ user_match_ratings ║ 1 ║ user_match_ratings_index3 ║ 1 ║ rated_user_id ║ A ║ 2480687 ║ NULL ║ NULL ║ BTREE ║ ║ ║
╚════════════════════╩════════════╩═══════════════════════════╩══════════════╩═══════════════╩═══════════╩═════════════╩══════════╩════════╩═════════════════════════╩════════════╩══════════════════╝
इंडेक्स के साथ भी ये क्वेरी धीमी है।
मेरा प्रश्न:
एक सर्वर पर इस तालिका / डेटा को किसी अन्य डेटाबेस से अलग करेगा जिसमें मेमोरी में इस डेटा को संग्रहीत करने के लिए पर्याप्त रैम है जो इन प्रश्नों को गति देगा? क्या ऐसा कुछ भी है जिसमें टेबल / इंडेक्स स्थापित किए गए हैं ताकि हम इन प्रश्नों को तेज कर सकें?
वर्तमान में हमारे पास 16GB मेमोरी है; हालाँकि, हम या तो मौजूदा मशीन को 32GB में अपग्रेड करना चाहते हैं या कम से कम इतना ठोस राज्य ड्राइव के साथ एक नई मशीन जोड़ना चाहते हैं।
SELECT QUERY
। क्या आप सुझाव देंगे? PS आपके प्रश्न ने मुझे इस समुदाय (y) में शामिल होने के लिए मजबूर किया;