私は3つのテーブルを持っています。postadata
以下のクエリを使用して、すべての投稿とそのタグを連結して取得するクエリを実行していますtag
。tag_data
SELECT
postdata.data_id as data_id,
GROUP_CONCAT(DISTINCT(tag.tag_id)) as tag_ids,
GROUP_CONCAT(DISTINCT(tag.tag) ORDER BY tag.tag ASC) as tags
FROM postdata
LEFT JOIN tag_data as tag_data
INNER JOIN tag as tag
ON tag_data.tag_id = tag.tag_id
ON postdata.data_id = tag_Data.data_id
GROUP BY postdata.data_id
LIMIT 1000
しかし、それは非常に遅いです。(約20秒)。以下は説明です、私は問題を見つけることができないようです
1 SIMPLE postdata index NULL source_id 4 NULL 158808 Using index; Using temporary; Using filesort
1 SIMPLE tag_data index PRIMARY PRIMARY 8 NULL 45279 Using index
1 SIMPLE tag eq_ref PRIMARY PRIMARY 4 tag_data.tag_id 1
以下は投稿データのインデックスです
postdata 0 PRIMARY 1 data_id A 120405 NULL NULL BTREE
postdata 1 source_id 1 source_id A 168 NULL NULL BTREE
クエリに問題がありますか?より効率的に書く方法はありますか?それとも、欠落しているインデックスですか?
更新: jordeu のコメントに従ってインデックス情報を追加する
SHOW TABLE STATUS FROM [database_name] WHERE Name='postdata'
Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment
postdata InnoDB 10 Compact 158645 43 6832128 0 8421376 4194304 NULL 2012-03-08 09:22:40 NULL NULL utf8_unicode_ci NULL
「key_buffer_size」のような変数を表示
key_buffer_size 16777216