在MYSQL

时间:2017-06-01 20:07:46

标签: php mysql

我正在为学术书籍开发个人项目。我有一些表,每行有+30.000行,用于作品,版本,作者等。书籍的所有信息 - 作者,主题,作者,出版商等 - 分布在许多不同类型的关系表中。

我查询了有效的主页面,但该网站需要六秒钟才能加载。很多时候......我想知道哪种方法可以获得临时表所需的所有数据。

我现在要做的是将临时表_work与另一个表的相关数据联系起来,比如«genre»。但是«work»和«genre»之间的关系是通过临时表«work_has_genre»完成的。我知道如何在单个查询中使用普通表:

SELECT *
FROM work a
LEFT JOIN (
    SELECT GROUP_CONCAT(f_a.id SEPARATOR '|') AS genre_id, GROUP_CONCAT(f_a.genre SEPARATOR '|') AS genre_name, f_b.work_id AS _work_id
    FROM genre f_a
    INNER JOIN (
        SELECT *
        FROM work_has_genre f_b_a
    ) f_b
    ON f_a.id=f_b.genre_id
    GROUP BY f_b.work_id
) f
ON a.id=f._work_id
WHERE a.id=13

我想这个想法是在部分中打破这个行为,但我不知道如何。有人可以用一些伪代码帮助我吗?或者这可能不是最好的方法。任何想法都会受到欢迎!

一个。

1 个答案:

答案 0 :(得分:0)

正如我在评论中所说的那样,我首先会建议尽可能多地重新处理/展平子查询,但是一旦进入半独立聚合,临时表就会有所帮助。

通常,模式是将每个这样的聚合子查询的结果放入它自己的临时表(子查询连接到主查询的字段上的索引),即使这意味着添加表(和主查询的WHERE)到原始子查询,然后加入主查询中的临时表。