簡體   English   中英

使用“在哪里”和“按選擇計數排序”的查詢速度慢

[英]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.useridpost.poster_idfollowtoid.followeriduser.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']

第二個是JOINGROUP 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM