Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/229.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 mysql长时间查询_Php_Mysql_Sql - Fatal编程技术网

Php mysql长时间查询

Php mysql长时间查询,php,mysql,sql,Php,Mysql,Sql,我对我的PHP脚本有一个查询,它花费的时间太长了! 当我运行查询时,服务器加载时间增加,服务器停机 注意:这些字段是索引:t1.提交id,t4.提交id,t3.用户id,t1.用户id,所有者id,邀请id,同意,t2.用户id,t1.发送时间戳 SELECT t1.submits_id,t1.user_id,is_html,shared_from,type,contents,url,sent_timestamp,show_type,album_cached_info, t2.users_id,

我对我的PHP脚本有一个查询,它花费的时间太长了! 当我运行查询时,服务器加载时间增加,服务器停机

注意:这些字段是索引:t1.提交id,t4.提交id,t3.用户id,t1.用户id,所有者id,邀请id,同意,t2.用户id,t1.发送时间戳

SELECT
t1.submits_id,t1.user_id,is_html,shared_from,type,contents,url,sent_timestamp,show_type,album_cached_info,
t2.users_id,name,t2.active,page_url,
t3.time,
t4.like_time
FROM iv6_submits as t1 LEFT JOIN iv6_likes as t4 ON (t1.submits_id = t4.submit_id AND t4.user_id=1)

,iv6_users as t2 LEFT JOIN iv6_onlineusers as t3 ON (t2.users_id=t3.userid)
WHERE
t1.submits_id<19000 AND 
(t1.user_id=1 OR t1.user_id in
    (select IF(owner_id=1,invited_id,owner_id) as id
        from iv6_add_lists
            where ((owner_id=1 or invited_id=1) AND agreed=1) OR (owner_id=1 AND agreed=2)))
AND t2.users_id=t1.user_id
ORDER BY t1.sent_timestamp DESC LIMIT 10
选择
t1.提交\ id,t1.用户\ id,是\ html,共享\来源,类型,内容,url,发送\时间戳,显示\类型,相册\缓存\信息,
t2.用户id、名称、t2.活动、页面url、,
时间,
t4.喜欢的时间
从iv6提交为t1左连接iv6提交为t4 ON(t1.submits\u id=t4.submit\u id和t4.user\u id=1)
,iv6_用户作为t2左连接iv6_在线用户作为t3打开(t2.users_id=t3.userid)
哪里

t1.提交\u id我建议您拆分查询以查看资源的消耗位置

  • 在WHERE部分执行子查询,看看它是否运行得很快
  • 移除左侧连接,然后逐个添加,以查看所有连接的位置
  • 删除所有“WHERE”条件并逐个添加
  • 尝试在不使用“orderby”语句的情况下运行查询
您没有将t4.user_id作为索引,这可能很重要。 表iv6_add_列表还应该包含WHERE语句中的所有字段

还建议您在t1和t2之间进行内部连接:

FROM (iv6_submits as t1 
        LEFT JOIN iv6_likes as t4 ON (t1.submits_id = t4.submit_id AND t4.user_id=1))
     INNER JOIN 
    (iv6_users as t2 
        LEFT JOIN iv6_onlineusers as t3 ON (t2.users_id=t3.userid))

    ON t2.users_id=t1.user_id
然后你可以移除

AND t2.users_id=t1.user_id

从WHERE语句中。

我建议您拆分查询以查看资源的消耗位置

  • 在WHERE部分执行子查询,看看它是否运行得很快
  • 移除左侧连接,然后逐个添加,以查看所有连接的位置
  • 删除所有“WHERE”条件并逐个添加
  • 尝试在不使用“orderby”语句的情况下运行查询
您没有将t4.user_id作为索引,这可能很重要。 表iv6_add_列表还应该包含WHERE语句中的所有字段

还建议您在t1和t2之间进行内部连接:

FROM (iv6_submits as t1 
        LEFT JOIN iv6_likes as t4 ON (t1.submits_id = t4.submit_id AND t4.user_id=1))
     INNER JOIN 
    (iv6_users as t2 
        LEFT JOIN iv6_onlineusers as t3 ON (t2.users_id=t3.userid))

    ON t2.users_id=t1.user_id
然后你可以移除

AND t2.users_id=t1.user_id

从WHERE语句中。

我建议您拆分查询以查看资源的消耗位置

  • 在WHERE部分执行子查询,看看它是否运行得很快
  • 移除左侧连接,然后逐个添加,以查看所有连接的位置
  • 删除所有“WHERE”条件并逐个添加
  • 尝试在不使用“orderby”语句的情况下运行查询
您没有将t4.user_id作为索引,这可能很重要。 表iv6_add_列表还应该包含WHERE语句中的所有字段

还建议您在t1和t2之间进行内部连接:

FROM (iv6_submits as t1 
        LEFT JOIN iv6_likes as t4 ON (t1.submits_id = t4.submit_id AND t4.user_id=1))
     INNER JOIN 
    (iv6_users as t2 
        LEFT JOIN iv6_onlineusers as t3 ON (t2.users_id=t3.userid))

    ON t2.users_id=t1.user_id
然后你可以移除

AND t2.users_id=t1.user_id

从WHERE语句中。

我建议您拆分查询以查看资源的消耗位置

  • 在WHERE部分执行子查询,看看它是否运行得很快
  • 移除左侧连接,然后逐个添加,以查看所有连接的位置
  • 删除所有“WHERE”条件并逐个添加
  • 尝试在不使用“orderby”语句的情况下运行查询
您没有将t4.user_id作为索引,这可能很重要。 表iv6_add_列表还应该包含WHERE语句中的所有字段

还建议您在t1和t2之间进行内部连接:

FROM (iv6_submits as t1 
        LEFT JOIN iv6_likes as t4 ON (t1.submits_id = t4.submit_id AND t4.user_id=1))
     INNER JOIN 
    (iv6_users as t2 
        LEFT JOIN iv6_onlineusers as t3 ON (t2.users_id=t3.userid))

    ON t2.users_id=t1.user_id
然后你可以移除

AND t2.users_id=t1.user_id

从WHERE语句开始。

我首先将查询写为:

    SELECT t1.submits_id, 
           t1.user_id,
           is_html,  /* I'd append all table aliases here */
           shared_from,
           type,
           contents,
           url,
           sent_timestamp,
           show_type,
           album_cached_info,
           t2.users_id,
           name,
           t2.active,page_url,
           t3.time,
           t4.like_time
      FROM iv6_submits as t1
      JOIN iv6_users as t2
        ON t2.users_id=t1.user_id
 LEFT JOIN iv6_likes as t4 
        ON t4.submit_id = t1.submits_id 
       AND t4.user_id=1
 LEFT JOIN iv6_onlineusers as t3 
        ON t3.userid = t2.users_id
     WHERE t1.submits_id<19000 
       AND (
             t1.user_id=1 
          OR t1.user_id IN (
        SELECT IF(owner_id=1,invited_id, owner_id) as id
          FROM iv6_add_lists
         WHERE ((owner_id=1 OR invited_id=1) AND agreed=1) 
            OR (owner_id=1 AND agreed=2))
           )
  ORDER BY t1.sent_timestamp DESC 
     LIMIT 10
您的子查询也是v。奇怪,我把它改写成这样:

   SELECT invited_id 
     FROM iv6_add_lists 
    WHERE owner_id = 1 
      AND agreed BETWEEN 1 AND 2
UNION ALL 
   SELECT owner_id 
     FROM iv6_add_lists  
    WHERE invited_id = 1
      AND agreed = 1
      AND owner_id != 1
看看这是否也有帮助,您可以提示每个源的索引。(owner_id,agreed,invested_id)和(invested_id,agreed,owner_id)上的复合索引应分别包含这两个查询

你也可以这样写

   SELECT 1
    UNION
   SELECT DISTINCT invited_id 
     FROM iv6_add_lists 
    WHERE owner_id = 1 
      AND agreed BETWEEN 1 AND 2
    UNION 
   SELECT DISTINCT owner_id 
     FROM iv6_add_lists  
    WHERE owner_id != 1
      AND agreed = 1
      AND invited_id = 1 
将它连接到您的
t1
,而不是
和(t1.user\u id=1或…)

更新

    SELECT t1.submits_id, 
           t1.user_id,
           is_html,  /* I'd append all table aliases here */
           shared_from,
           type,
           contents,
           url,
           sent_timestamp,
           show_type,
           album_cached_info,
           t2.users_id,
           name,
           t2.active,page_url,
           t3.time,
           t4.like_time
      FROM iv6_submits as t1
      JOIN iv6_users as t2
        ON t2.users_id=t1.user_id
      JOIN (
        SELECT 1 user_id
         UNION
        SELECT DISTINCT invited_id 
          FROM iv6_add_lists 
         WHERE owner_id = 1 
           AND agreed BETWEEN 1 AND 2
         UNION 
        SELECT DISTINCT owner_id 
          FROM iv6_add_lists  
         WHERE owner_id != 1
           AND agreed = 1
           AND invited_id = 1
           ) t5
        ON t1.user_id = t5.user_id
 LEFT JOIN iv6_likes as t4 
        ON t4.submit_id = t1.submits_id 
       AND t4.user_id=1
 LEFT JOIN iv6_onlineusers as t3 
        ON t3.userid = t2.users_id
     WHERE t1.submits_id<19000 
  ORDER BY t1.sent_timestamp DESC 
     LIMIT 10
选择t1.u id,
t1.U用户id,
是_html,/*我会在这里附加所有表别名*/
从,
类型,
目录
网址,
发送时间戳,
显示_类型,
相册\u缓存\u信息,
t2.用户识别码,
名称
t2.活动,第页url,
时间,
t4.喜欢的时间
从iv6开始,U作为t1提交
以t2身份加入iv6_用户
在t2.users\u id=t1.user\u id上
加入(
选择1个用户id
联合
选择不同的用户id
从iv6添加列表
其中owner_id=1
并在1和2之间达成一致
联合
选择不同的所有者id
从iv6添加列表
其中所有者id!=1
并同意=1
并且被邀请的\u id=1
)t5
在t1.user\u id=t5.user\u id上
左连接iv6_与t4一样
在t4.submit\u id=t1.submits\u id上
和t4。用户_id=1
左连接iv6_在线用户作为t3
在t3.userid=t2.users\u id上

其中t1.id我首先将查询写为:

    SELECT t1.submits_id, 
           t1.user_id,
           is_html,  /* I'd append all table aliases here */
           shared_from,
           type,
           contents,
           url,
           sent_timestamp,
           show_type,
           album_cached_info,
           t2.users_id,
           name,
           t2.active,page_url,
           t3.time,
           t4.like_time
      FROM iv6_submits as t1
      JOIN iv6_users as t2
        ON t2.users_id=t1.user_id
 LEFT JOIN iv6_likes as t4 
        ON t4.submit_id = t1.submits_id 
       AND t4.user_id=1
 LEFT JOIN iv6_onlineusers as t3 
        ON t3.userid = t2.users_id
     WHERE t1.submits_id<19000 
       AND (
             t1.user_id=1 
          OR t1.user_id IN (
        SELECT IF(owner_id=1,invited_id, owner_id) as id
          FROM iv6_add_lists
         WHERE ((owner_id=1 OR invited_id=1) AND agreed=1) 
            OR (owner_id=1 AND agreed=2))
           )
  ORDER BY t1.sent_timestamp DESC 
     LIMIT 10
您的子查询也是v。奇怪,我把它改写成这样:

   SELECT invited_id 
     FROM iv6_add_lists 
    WHERE owner_id = 1 
      AND agreed BETWEEN 1 AND 2
UNION ALL 
   SELECT owner_id 
     FROM iv6_add_lists  
    WHERE invited_id = 1
      AND agreed = 1
      AND owner_id != 1
看看这是否也有帮助,您可以提示每个源的索引。(owner_id,agreed,invested_id)和(invested_id,agreed,owner_id)上的复合索引应分别包含这两个查询

你也可以这样写

   SELECT 1
    UNION
   SELECT DISTINCT invited_id 
     FROM iv6_add_lists 
    WHERE owner_id = 1 
      AND agreed BETWEEN 1 AND 2
    UNION 
   SELECT DISTINCT owner_id 
     FROM iv6_add_lists  
    WHERE owner_id != 1
      AND agreed = 1
      AND invited_id = 1 
将它连接到您的
t1
,而不是
和(t1.user\u id=1或…)

更新

    SELECT t1.submits_id, 
           t1.user_id,
           is_html,  /* I'd append all table aliases here */
           shared_from,
           type,
           contents,
           url,
           sent_timestamp,
           show_type,
           album_cached_info,
           t2.users_id,
           name,
           t2.active,page_url,
           t3.time,
           t4.like_time
      FROM iv6_submits as t1
      JOIN iv6_users as t2
        ON t2.users_id=t1.user_id
      JOIN (
        SELECT 1 user_id
         UNION
        SELECT DISTINCT invited_id 
          FROM iv6_add_lists 
         WHERE owner_id = 1 
           AND agreed BETWEEN 1 AND 2
         UNION 
        SELECT DISTINCT owner_id 
          FROM iv6_add_lists  
         WHERE owner_id != 1
           AND agreed = 1
           AND invited_id = 1
           ) t5
        ON t1.user_id = t5.user_id
 LEFT JOIN iv6_likes as t4 
        ON t4.submit_id = t1.submits_id 
       AND t4.user_id=1
 LEFT JOIN iv6_onlineusers as t3 
        ON t3.userid = t2.users_id
     WHERE t1.submits_id<19000 
  ORDER BY t1.sent_timestamp DESC 
     LIMIT 10
选择t1.u id,
t1.U用户id,
是_html,/*我会在这里附加所有表别名*/
从,
类型,
目录
网址,
发送时间戳,
显示_类型,
相册\u缓存\u信息,
t2.用户识别码,
名称
t2.活动,第页url,
时间,
t4.喜欢的时间
从iv6开始,U作为t1提交
以t2身份加入iv6_用户
在t2.users\u id=t1.user\u id上
加入(
选择1个用户id
联合
选择DI