mysql 慢速查询获取帖子和标签

标签 mysql database-design

我有三张 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/

相关文章:

Mysql 安装程序显示错误 : Memoy could not be written

mysql phpmyadmin 替换包含问号的字符串

php - 奇怪的MySQL连接错误

mysql - docker compose MySQL 容器 [2002] 连接被拒绝

sql - 挣扎于电话号码的 MySQL 数据库

database - 有什么好的方法可以实现与代码库同步的敏捷数据库过程,尤其是在持续集成方面?

mysql - 从多个缺少字段的表中进行 SQL 查询

mysql - 并发插入 mysql - 在第一组插入完成之前调用相同的插入存储过程

database-design - PostgreSQL 的数据库图表工具

mysql - 我应该如何创建一个数据库表,在其中保留多个事件名称及其时间戳,并使用设备 token 作为外键