Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/230.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
Php 在同一个表上的多个联接似乎会影响性能的情况下,如何改进此查询_Php_Mysql - Fatal编程技术网

Php 在同一个表上的多个联接似乎会影响性能的情况下,如何改进此查询

Php 在同一个表上的多个联接似乎会影响性能的情况下,如何改进此查询,php,mysql,Php,Mysql,以下查询用于在电子商务网站上搜索产品数据库时应用多个筛选值 当您使用7个以上的过滤器时,MySQL服务器将关闭 是否有机会加入一次职位\类别\链接 是否应该考虑更改数据库结构? 每种产品有一个eshop_猫类别(多个),最多20个 类别具有多个关系(多个) 表eshop_pos有40000条记录并包含产品 表eshop_cats有340条记录,包含主要类别 表categories有6000条记录,其中包含双工类别 表positions\u categories\u links有360000条

以下查询用于在电子商务网站上搜索产品数据库时应用多个筛选值

当您使用7个以上的过滤器时,MySQL服务器将关闭

  • 是否有机会加入一次
    职位\类别\链接
  • 是否应该考虑更改数据库结构?
每种产品有一个
eshop_猫
类别(多个),最多20个
类别
具有多个关系(多个)

eshop_pos
有40000条记录并包含产品

eshop_cats
有340条记录,包含主要类别

categories
有6000条记录,其中包含双工类别

positions\u categories\u links
有360000条记录,包含产品和类别之间的键


这是我的疑问:

SELECT COUNT(DISTINCT eshop_pos.id)
FROM eshop_pos
INNER JOIN eshop_cats t1 ON eshop_pos.eshopcatid = t1.id
    AND t1.active = 1
INNER JOIN positions_categories_links t2 ON t2.pos_id = eshop_pos.id
INNER JOIN categories t3 ON t3.id = t2.cat_id
    AND t3.active = 1
    AND t3.section_id = 62021
INNER JOIN positions_categories_links t4 ON t4.pos_id = eshop_pos.id
INNER JOIN categories t5 ON t5.id = t4.cat_id
    AND t5.active = 1
    AND t5.section_id = 62023
INNER JOIN positions_categories_links AS duplex_links_51 ON duplex_links_51.pos_id = eshop_pos.id
    AND duplex_links_51.cat_id = 51
    AND duplex_links_51.value IN (2984)
INNER JOIN positions_categories_links AS duplex_links_52 ON duplex_links_52.pos_id = eshop_pos.id
    AND duplex_links_52.cat_id = 52
    AND duplex_links_52.value IN (3003)
INNER JOIN positions_categories_links AS duplex_links_3904 ON duplex_links_3904.pos_id = eshop_pos.id
    AND duplex_links_3904.cat_id = 3904
    AND duplex_links_3904.value IN (3941)
INNER JOIN positions_categories_links AS duplex_links_4462 ON duplex_links_4462.pos_id = eshop_pos.id
    AND duplex_links_4462.cat_id = 4462
    AND duplex_links_4462.value IN (4465)
INNER JOIN positions_categories_links AS duplex_links_4466 ON duplex_links_4466.pos_id = eshop_pos.id
    AND duplex_links_4466.cat_id = 4466
    AND duplex_links_4466.value IN (4468)
INNER JOIN positions_categories_links AS duplex_links_4472 ON duplex_links_4472.pos_id = eshop_pos.id
    AND duplex_links_4472.cat_id = 4472
    AND duplex_links_4472.value IN (4473)
INNER JOIN positions_categories_links AS duplex_links_4974 ON duplex_links_4974.pos_id = eshop_pos.id
    AND duplex_links_4974.cat_id = 4974
    AND duplex_links_4974.value IN (4978)
INNER JOIN positions_categories_links AS duplex_links_4979 ON duplex_links_4979.pos_id = eshop_pos.id
    AND duplex_links_4979.cat_id = 4979
    AND duplex_links_4979.value IN (4982)
INNER JOIN positions_categories_links AS duplex_links_4984 ON duplex_links_4984.pos_id = eshop_pos.id
    AND duplex_links_4984.cat_id = 4984
    AND duplex_links_4984.value IN (4986)
我无法在服务器上运行查询的解释。但是,它在我的本地笔记本电脑上运行良好:


稍微更改了查询的格式。我还将别名引用从“duplex_links”引用更改为缩写别名“PCL”(从“Position_categories_links”表中)。。较短且相关的表引用(至少对我和其他人来说是如此)

至于您的表/索引,如果它们还不存在,我建议您使用下面的表/索引。在本例中,我为您的查询提供了所有覆盖索引,这意味着由于用于满足所有联接条件的列都是索引的一部分,因此sql数据库不必转到底层的实际数据页来确认其他详细信息,从而有助于提高性能

Table                       Index
eshop_pos                   (id, eshopcatid)
eshop_cats                  (id, active)
positions_categories_links  (pos_id, cat_id, value)
categories                  (id, active, section_id)
我还想展示连接位置之间的缩进关联,这样您就知道如何从一个表/别名到下一个级别。。您可以直接看到事物的层次结构

SELECT 
      COUNT(DISTINCT eshop_pos.id) 
   FROM 
      eshop_pos 
         inner join eshop_cats t1 
            on eshop_pos.eshopcatid = t1.id 
           AND t1.active = 1 

         inner join positions_categories_links t2 
            on eshop_pos.id = t2.pos_id

            inner join categories t3 
               on t2.cat_id = t3.id
              and t3.active = 1 
              and t3.section_id = 62021 

         inner join positions_categories_links t4 
            on eshop_pos.id = t4.pos_id

            inner join categories t5 
               on t4.cat_id = t5.id
              and t5.active = 1 
              and t5.section_id = 62023 

         INNER JOIN positions_categories_links AS PCL51 
            ON eshop_pos.id = PCL51.pos_id
           AND PCL51.cat_id = 51 
           and PCL51.value in (2984) 

         INNER JOIN positions_categories_links AS PCL52 
            ON eshop_pos.id = PCL52.pos_id
           AND PCL52.cat_id = 52 
           and PCL52.value in (3003) 

         INNER JOIN positions_categories_links AS PCL3904 
            ON eshop_pos.id = PCL3904.pos_id
           AND PCL3904.cat_id = 3904 
           and PCL3904.value in (3941) 

         INNER JOIN positions_categories_links AS PCL4462
            ON eshop_pos.id = PCL4462.pos_id
           AND PCL4462.cat_id = 4462 
           and PCL4462.value in (4465) 

         INNER JOIN positions_categories_links AS PCL4466 
            ON eshop_pos.id = PCL4466.pos_id
           AND PCL4466.cat_id = 4466 
           and PCL4466.value in (4468) 
现在,拥有适当的索引来帮助优化查询是一件事,但是不断地对这样多个条件进行计数可能会有点过头。如果你有一个已知的特定细节级别,比如你在这里做的特定类别,肯定会有帮助


(删除了不保证所有标准的“或”版本)

请花些时间检查您的问题并解决格式问题。谢谢!我刚完成编辑,我会帮你的,因为这是你在这个网站的第一天。给我几分钟,然后接受我对你文章的编辑。花点时间看看这些差异,然后试着更加小心地问下一个问题。谢谢!看起来不错。你说的下降是什么意思?服务器崩溃了吗?它超时了吗?它不会回来。你也能解释一下这个问题吗?谢谢你的解答。在快速回顾之后,我想它将输出不同的结果。在上面的查询中,使用了内部联接,您建议使用OR@AndreyLartsev啊。。。正确的。。。忽略OR'd版本,我将删除它,因为你希望所有的都是合格的。。。