Php mysql长时间查询
我对我的PHP脚本有一个查询,它花费的时间太长了! 当我运行查询时,服务器加载时间增加,服务器停机 注意:这些字段是索引:t1.提交id,t4.提交id,t3.用户id,t1.用户id,所有者id,邀请id,同意,t2.用户id,t1.发送时间戳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,
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