0

質問は 1 つだけです: 1.000.000 行のテーブル (activity_feed)、フィードを要求したユーザーとそのユーザーが表示するアクティビティとの関係を示すテーブル (activity_feed_per_user)、およびそのテーブルからいくつかの統計を取得したテーブルがあるとします。アプリによってすべて取得されるアクティビティ。

結果をランクで並べ替える必要がある場合 (これは時間によっても異なるため、1 秒ごとに変化します)、このクエリを使用するのは適切ですか? それとも全然ない?

EXPLAIN EXTENDED SELECT feed.activity_id, feed.body, counter.comments, counter.likes, user.username,
(0.25 * (
        (1 / TIMESTAMPDIFF(MINUTE,feed.datetime,now()) ) +
        ( 1 - (1 / (((comments + 1)* 1) + ((likes + 1) * 0.5))) ) +
        activity_type.peso +
        user_affinity.affinity
    )) as ranking
FROM activity_feed_per_user as feed_user
INNER JOIN activity_feed as feed ON feed_user.activity_id = feed.activity_id
INNER JOIN activity_type ON feed.activity_type = activity_type.activity_type_id
INNER JOIN activity_social_counter as counter ON feed_user.activity_id = counter.activity_id
INNER JOIN user_info as user ON user.user_id = feed.user_id
INNER JOIN user_affinity ON feed.user_id = user_affinity.user_related AND user_affinity.user_id = '1'
WHERE feed_user.user_id = '1' 
ORDER BY ranking DESC

これが説明です

1 | SIMPLE | user_affinity | ref | PRIMARY | PRIMARY | 4 | const | 2 | 100.00 | Using temporary; Using filesor
1 | SIMPLE | user | eq_ref | PRIMARY | PRIMARY | 4 |db.user_affinity.user_related | 1 | 100.00
1 | SIMPLE | feed_user | ref | PRIMARY | PRIMARY | 4 | const | 9 | 100.00 | Using index
1 | SIMPLE | feed | eq_refvPRIMARY,activity_type,user_idvPRIMARY | 4 | db.feed_user.activity_id | 1 | 100.00 | Using where
1 | SIMPLE | activity_type | eq_ref | PRIMARY | PRIMARY | 1 | db.feed.activity_type | 1 | 100.00
1 | SIMPLE | counter | eq_ref | PRIMARY | PRIMARY | 4 | db.feed_user.activity_id | 1 | 100.00
4

2 に答える 2

1

ORDER BYインデックスを持たない値では、クエリが生成するすべての行を確認する必要があるため、提案するものは、巨大な結果セットを返すクエリのパフォーマンスを損なう可能性があります。

于 2013-03-29T12:47:56.237 に答える
0

ORDER BYクエリの は、「ファイルソートを使用する」操作を強制します。これは、大きな結果セットに対して高価な操作になる可能性があります。(MySQL は、インデックスを使用して ORDER BY を満たすことができる場合があり、「ファイルソートを使用する」操作を回避します。ただし、この場合、結果セット内のすべての行に対して式 (「数学」) を評価する必要があります。

必要な結果セットが返されている場合、クエリは問題ないようです。

于 2013-03-29T12:55:31.063 に答える