Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
加快兼容的MySQL查询(目前大约需要15秒)_Mysql_Join_Indexing - Fatal编程技术网

加快兼容的MySQL查询(目前大约需要15秒)

加快兼容的MySQL查询(目前大约需要15秒),mysql,join,indexing,Mysql,Join,Indexing,我对索引还不熟悉,不完全了解,但是-除了主索引“articles”表“Article”,我所有的表都使用索引。我没有那么多的记录,但是查询大约需要15秒,这显然是不可接受的 我正在使用CakePHP构建查询,尽管我不确定这是否重要 我试着为slug做索引,为id做索引,为created,rank_id,id,blog做索引 但是,它不会使用任何这些 文章解释表:增加了完整的解释 查询: 我不太了解您的数据,但我怀疑您是否需要所有这些左联接。请记住,可以使用括号分隔逻辑。例如: table1 t1

我对索引还不熟悉,不完全了解,但是-除了主索引“articles”表“Article”,我所有的表都使用索引。我没有那么多的记录,但是查询大约需要15秒,这显然是不可接受的

我正在使用CakePHP构建查询,尽管我不确定这是否重要

我试着为slug做索引,为id做索引,为created,rank_id,id,blog做索引

但是,它不会使用任何这些

文章解释表:增加了完整的解释

查询:


我不太了解您的数据,但我怀疑您是否需要所有这些左联接。请记住,可以使用括号分隔逻辑。例如:

table1 t1
left join (
    table2 t2
    inner join table3 t3 on (t3.some_id = t2.some_id)
    inner join table4 t4 on (t4.some_id = t3.some_id)
) on (t1.some_id = t2.some_id)
left join table5 t5 on (t5.some_id = t1.some_id)

当您只使用所需的联接类型时,查询可以执行得更好。

请对select命令进行解释。我解释了-因此使用了explain for Article表:part。除非我误解了你?是的。以您向我们展示的select查询为例,在前面加上explain这个词,然后运行.I。做那个你看过我的问题了吗?你想问其他解释数据吗?当然,我希望看到整个解释输出。我不希望你只从中删去一行…从我所读到的,CakePHP不允许嵌套联接-至少在它的语法中是这样的,我想继续使用它-还有其他方法吗?例如,我必须做一些事情才能让文章表使用索引-y/n?@Dave我认为在这种情况下使用索引非常困难,因为文章表位于最左侧,WHERE子句中没有特定于文章的筛选器。WHERE子句的“Article.id”部分是否足够好?或者-即使我必须放弃对文章表进行索引,也要考虑加快查询速度吗?@Dave Article.id在本文中是一个连接条件,而不是过滤器。通常,如果联接两个表,则其中只有一个表在联接键时使用索引。也许您可以将一些连接条件移动到ON子句,然后从WHERE子句中删除一些is NULL条件,如果这不会破坏主逻辑的话。
SELECT
  Article.title,
  GROUP_CONCAT(
        `Upload`.`path`,
        `Upload`.`name`
  ORDER BY
        `Upload`.`featured` DESC
  )AS Uploads,
  `ArticlesSiteArea`.`id`,
  `ArticlesSiteArea`.`weight`
FROM
  `articles` AS `Article`
LEFT JOIN uploads AS `Upload` ON(
  `Article`.`id` = `Upload`.`foreign_key`
  AND 'Article' = `Upload`.`model`
)
LEFT JOIN site_areas AS `SiteArea` ON(`SiteArea`.`id` = '1')
LEFT JOIN site_areas_site_sections AS `SiteAreasSiteSection` ON(
  `SiteArea`.`id` = `SiteAreasSiteSection`.`site_area_id`
)
LEFT JOIN site_areas_site_sub_sections AS `SiteAreasSiteSubSection` ON(
  `SiteArea`.`id` = `SiteAreasSiteSubSection`.`site_area_id`
)
LEFT JOIN site_sections AS `SiteSection` ON(
  `SiteSection`.`id` = `SiteAreasSiteSection`.`site_section_id`
)
LEFT JOIN site_sub_sections AS `SiteSubSection` ON(
  `SiteSubSection`.`id` = `SiteAreasSiteSubSection`.`site_sub_section_id`
)
LEFT JOIN ranks_site_areas AS `RanksSiteArea` ON(
  `SiteArea`.`id` = `RanksSiteArea`.`site_area_id`
)
LEFT JOIN articles_site_sections AS `ArticlesSiteSection` ON(
  `SiteSection`.`id` = `ArticlesSiteSection`.`site_section_id`
)
LEFT JOIN articles_site_sub_sections AS `ArticlesSiteSubSection` ON(
  `SiteSubSection`.`id` = `ArticlesSiteSubSection`.`site_sub_section_id`
)
LEFT JOIN articles_site_areas AS `ArticlesSiteArea` ON(
  `ArticlesSiteArea`.`article_id` = `Article`.`id`
)
WHERE
  (
        (
              `ArticlesSiteArea`.`id` IS NOT NULL
        )
        OR(
              (
                    (`Upload`.`name` <> '')
                    AND(
                          (
                                (
                                      `Article`.`id` = `ArticlesSiteSection`.`article_id`
                                )
                                OR(
                                      `ArticlesSiteSection`.`article_id` IS NULL
                                )
                          )
                    )
                    AND(
                          (
                                (
                                      `Article`.`id` = `ArticlesSiteSubSection`.`article_id`
                                )
                                OR(
                                      `ArticlesSiteSubSection`.`article_id` IS NULL
                                )
                          )
                    )
                    AND(
                          (
                                (
                                      `RanksSiteArea`.`rank_id` = `Article`.`rank_id`
                                )
                                OR(
                                      `RanksSiteArea`.`rank_id` IS NULL
                                )
                          )
                    )
              )
        )
  )
GROUP BY
  `Article`.`id`
ORDER BY
  `ArticlesSiteArea`.`weight` DESC,
  `ArticlesSiteArea`.`id` DESC,
  SUBSTR(`Article`.`created`, 1, 10)DESC,
  FIELD(`Article`.`rank_id`, 1, 2, 3)DESC
LIMIT 4
table1 t1
left join (
    table2 t2
    inner join table3 t3 on (t3.some_id = t2.some_id)
    inner join table4 t4 on (t4.some_id = t3.some_id)
) on (t1.some_id = t2.some_id)
left join table5 t5 on (t5.some_id = t1.some_id)