문제:
우리는 회원들이 서로 호환성이나 매칭에 대해 서로를 평가할 수있는 소셜 사이트를 가지고 있습니다. 이 user_match_ratings
테이블에는 2 억 2 천만 개가 넘는 행 (9 개의 기가 데이터 또는 거의 20 개의 기가 색인)이 포함됩니다. 이 테이블에 대한 쿼리는 일반적으로 slow.log (임계 값> 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
- 버전 bdb : Sleepycat 소프트웨어 : Berkeley DB 4.1.24 : (2009 년 1 월 29 일)
- 버전 컴파일 머신 : 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);)