我有三张桌子。一个包含帖子 ( 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索引
postdata 0 PRIMARY 1 data_id A 120405 NULL NULL BTREE
postdata 1 source_id 1 source_id A 168 NULL NULL BTREE
是不是查询有问题?有没有办法更有效地编写它?还是缺少索引?
更新:根据 jordeu 的评论添加索引信息
显示来自 [database_name] 的表状态,其中 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