Saya mencoba mengoptimalkan kueri berikut. Saya telah menggunakan EXPLAIN untuk memecahkan masalah tetapi itu terus muncul di log kami sebagai kueri yang tidak diindeks. Apa yang saya lewatkan? Saya telah membuat indeks pada semua kolom yang dirujuk, tetapi masih muncul.

select `users`.`nickname`, `users`.`userId`, `userdata`.`avatarUpdatedAt` 
from `users` 
inner join `userdata` on `userdata`.`userId` = `users`.`userId` 
order by `lastActivity` desc 
limit 28
+---+---+---+---+---+---+---+---+---+---+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+---+---+---+---+---+---+---+---+---+---+
| 1 | SIMPLE | users | index | PRIMARY,userId | lastActivity | 8 | NULL | 28 |  |
| 1 | SIMPLE | userdata | eq_ref | userdata_userid_unique | userdata_userid_unique | 8 | prod.users.userId | 1 | Using index condition |
+---+---+---+---+---+---+---+---+---+---+

# Time: 200703  6:14:18
# User@Host: prod[prod] @ localhost [127.0.0.1]
# Thread_id: 17988  Schema: prod  QC_hit: No
# Query_time: 0.000201  Lock_time: 0.000011  Rows_sent: 28  Rows_examined: 56
# Rows_affected: 0  Bytes_sent: 1039
# Full_scan: Yes  Full_join: No  Tmp_table: No  Tmp_table_on_disk: No
# Filesort: No  Filesort_on_disk: No  Merge_passes: 0  Priority_queue: No
0
cx8z 3 Juli 2020, 07:09

1 menjawab

Jawaban Terbaik

Jika Anda memiliki tabel besar yang berisi jutaan baris, sebaiknya gunakan kondisi where untuk memfilter data agar kueri berjalan lebih cepat.

Pengindeksan akan membantu dalam mengambil data sehingga hanya memiliki indeks tidak membuat kueri berjalan lebih cepat.

select 
    u.nickname, 
    u.userId, 
    ud.avatarUpdatedAt 
from users u
inner join userdata ud
on ud.userId = u.userId
where ud.avatarUpdatedAt >= '2020-01-01'
and ud.avatarUpdatedAt <= '2020-05-01'
order by lastActivity desc 
1
zealous 3 Juli 2020, 04:14