Sorun:
Üyelerin uyumluluk veya eşleşme için birbirlerini değerlendirebilecekleri bir sosyal sitemiz var. Bu user_match_ratings
tablo 220 milyondan fazla satır içeriyor (9 gig veri veya indekslerde yaklaşık 20 gig). Bu tabloya karşı sorgular rutin olarak slow.log'da gösterilir (eşik> 2 saniye) ve sistemde en sık kaydedilen yavaş sorgudur:
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 sürümü:
- protokol sürümü: 10
- sürüm: 5.0.77-log
- bdb sürümü: Sleepycat Yazılımı: Berkeley DB 4.1.24: (29 Ocak 2009)
- sürüm derleme makinesi: x86_64 version_compile_os: redhat-linux-gnu
Tablo bilgisi:
SHOW COLUMNS FROM user_match_ratings;
verir:
╔═══════════════╦════════════╦════╦═════╦════════╦════════════════╗
║ 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 ║ ║
╚═══════════════╩════════════╩════╩═════╩════════╩════════════════╝
Örnek sorgu:
select * from mutual_match_ratings where id=221673540;
verir:
╔═══════════╦═══════════════╦═══════════════╦════════╦══════════════════════╗
║ id ║ rater_user_id ║ rated_user_id ║ rating ║ created_at ║
╠═══════════╬═══════════════╬═══════════════╬════════╬══════════════════════╣
║ 221673540 ║ 5699713 ║ 3890950 ║ N ║ 2013-04-09 13:00:38 ║
╚═══════════╩═══════════════╩═══════════════╩════════╩══════════════════════╝
endeksleri
Tabloda 3 indeks ayarlandı:
- tek dizin açık
rated_user_id
- bileşik dizin
rater_user_id
vecreated_at
- bileşik dizin
rated_user_id
verater_user_id
user_match_ratings dizinini göster;
verir:
╔════════════════════╦════════════╦═══════════════════════════╦══════════════╦═══════════════╦═══════════╦═════════════╦══════════╦════════╦═════════════════════════╦════════════╦══════════════════╗
║ 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 ║ ║ ║
╚════════════════════╩════════════╩═══════════════════════════╩══════════════╩═══════════════╩═══════════╩═════════════╩══════════╩════════╩═════════════════════════╩════════════╩══════════════════╝
Dizinlerde bile bu sorgular yavaş.
Benim sorum:
Bu tabloyu / verileri, bu verileri bellekte depolamak için yeterince ram olan bir sunucudaki başka bir veritabanına ayırmak, bu sorguları hızlandırabilir mi? Yine de, bu sorguları daha hızlı yapmak için geliştirebileceğimiz tabloların / indekslerin ayarlandığı herhangi bir şey var mı?
Şu anda 16GB belleğimiz var; ancak mevcut makineyi 32GB'a yükseltmeyi ya da en azından bu kadar katı hal sürücüleriyle yeni bir makine eklemeyi düşünüyoruz.
SELECT QUERY
. Lütfen önerir misiniz? PS Sorunuz beni bu topluluğa katılmaya zorladı (y);)