ปัญหา:
เรามีเว็บไซต์โซเชียลที่สมาชิกสามารถให้คะแนนซึ่งกันและกันเพื่อความเข้ากันได้หรือการจับคู่ นี้user_match_ratings
ตารางที่มีมากกว่า 220 ล้านแถว (9 ข้อมูลกิ๊กหรือเกือบ 20 กิ๊กในดัชนี) ข้อความค้นหาที่อยู่ในตารางนี้แสดงเป็นประจำใน slow.log (threshold> 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:
- รุ่นโปรโตคอล: 10
- รุ่น: 5.0.77-log
- version bdb: ซอฟต์แวร์ Sleepycat: Berkeley 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
วินาที คุณช่วยแนะนำไหม ป.ล. คำถามของคุณบังคับให้ฉันเข้าร่วมชุมชนนี้ (y);)