このクエリを高速化するために考えられるすべてのことを試しましたが、それでも約2.5秒かかります。
テーブルはimages_tags(〜400万行)です:テーブルの説明は次のとおりです。
Field Type Null Key Default
image_ids int(7) unsigned NO PRI NULL
tags_id int(7) unsigned NO PRI NULL
インデックスは次のとおりです。
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type
images_tags 0 PRIMARY 1 image_ids A NULL NULL NULL BTREE
images_tags 0 PRIMARY 2 tags_id A 4408605 NULL NULL BTREE
images_tags 1 image_ids 1 image_ids A 734767 NULL NULL BTREE
そしてここにクエリがあります:
select image_ids
from images_tags
where tags_id in (1, 2, 21, 846, 3175, 4290, 6591, 9357, 9594, 14289, 43364, 135019, 151295, 208803, 704452)
group by image_ids
order by count(*) desc
limit 10
そして、これがクエリEXPLAINです。
select_type table type possible_keys key key_len ref rows Extra
SIMPLE vids_x_tags index join_tags_id join_vids_id_unique 8 NULL 4408605 Using where; Using index; Using temporary; Using filesort
目標は、これらのタグに最も一致する10枚の画像を取得することです。私はこれらの変数をいじってみましたが、ほとんどまたはまったく改善されていません。
- max_heap_table_size
- tmp_table_size
- myisam_sort_buffer_size
- read_buffer_size
- sort_buffer_size
- read_rnd_buffer_size
- net_buffer_length
- preload_buffer_size
- key_buffer_size
このクエリを大幅に高速化する方法はありますか?約70万枚の画像があり、常に増え続けているので、結果を1日か2日以上キャッシュしたくありません。また、画像ごとに実行する必要があるため、多くのクエリを再キャッシュすることは不可能です。