我有三张 table 。一个包含帖子 (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] 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
最佳答案
在 LEFT JOIN 之后无需使用 INNER JOIN。
尝试这种方法:
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
ON postdata.data_id = tag_Data.data_id
LEFT JOIN tag as tag
ON tag_data.tag_id = tag.tag_id
GROUP BY postdata.data_id
LIMIT 1000
关于mysql 慢速查询获取帖子和标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10141171/