[英]Slow query using “where in” and “order by select count”
我想向用戶顯示遵循指定用戶的帖子,下面有兩個表。 但是它的查詢非常慢。
表用戶
id | username
1 | name1
2 | name2
3 | name3
..
..
餐桌貼
id | poster_id | post_content
1 | 2
2 | 3
3 | 10
..
..
表跟隨
followerid | followtoid
1 | 2
1 | 3
2 | 10
..
..
假定所有表都有1000多個行。
這是SQL
SELECT *
FROM post
WHERE poster_id IN (
SELECT followtoid
WHERE followerid = $_SESSION['userid']
)
這也是第二個演員,也很慢。 我想按順序從其總職位中列出所有成員。
SELECT *
FROM user
ORDER BY (
SELECT COUNT(id)
FROM post
WHERE post_id = user.id
) DESC;
嘗試使用CREATE INDEX
索引post.userid
, post.poster_id
, followtoid.followerid
和user.user_id
,並在查詢中使用LEFT JOIN
子句:
SELECT *
FROM user u
LEFT JOIN SELECT poster_id, COUNT(*) as count FROM post p GROUP BY poster_id
ON (u.user_id = p.poster_id)
ORDER BY count DESC;
和:
SELECT * FROM post AS p
LEFT JOIN (SELECT followerid FROM followtoid) AS f
ON (p.userid=f.followerid)
WHERE p.userid = {$_SESSION['userid']}
對第一個查詢使用JOIN
SELECT p.*
FROM post p
JOIN follow f ON p.post_id = f.followtoid
WHERE f.followerid = $_SESSION['userid']
第二個是JOIN
加GROUP BY
SELECT u.*, tbl.postCount
FROM user u
JOIN (
SELECT poster_id, COUNT(*) AS postCount
FROM post p
GROUP BY posterID
) tbl ON tbl.poster_id = u.id
ORDER BY postCount DESC
您可以在沒有子查詢的情況下完成第二個查詢:
SELECT u.*, COUNT(p.poster_id) as postCount
FROM user u
LEFT JOIN post p
ON (u.user_id = p.poster_id)
GROUP BY u.user_id
ORDER BY postCount DESC;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.