0

私は何度も実行するこのクエリを持っています。これを最適化する方法を教えてください。インデックスは既にテーブルに適用されています。

SELECT
    DISTINCT b.appearance_id,
    b.photo_album_id,
    b.eventcmmnt_id,
    b.id,
    b.mem_id,
    b.subj,
    b.body,
    b.date,
    b.parentid,
    b.from_id,
    b.visible_to,
    b.image_link,
    b.post_via,
    b.youtubeLink,
    b.link_image,
    b.link_url,
    b.auto_genrate_text
FROM
    bulletin b
INNER JOIN
    network n
ON
    ( n.mem_id = b.mem_id )
WHERE
    b.parentid = '0' AND 
    '$userid' IN (n.frd_id, b.mem_id))
GROUP BY
    b.id
ORDER BY
    b.date DESC
LIMIT
    0,20
4

1 に答える 1

1

network.frd_idnetwork.mem_idおよびbulletin.mem_idすべてにインデックスが付けられていますか?そうでない場合、テーブルに大きなボリュームがあると混乱します。

また、and ('$userid' IN (n.frd_id, b.mem_id))コストの面でもひどいです。可能であれば、常になどに固執する必要があり=ます!=。この行をに置き換えることは可能and ('$userid' = n.frd_id or '$userid = b.mem_id)ですか?

最後に、レコードの観点から深刻なボリュームを検討している場合は、テーブルを並べ替えることが大きなメリットになる可能性があります。キー値によって識別される大量のデータを含む、いくつかの重いデータベースを稼働させています。通常、これらの値をある程度まで集計したいと思います。レコードをチャンクにグループ化するために時々実行するとalter table someTableName order by col1, col2;、一緒に集約または選別される可能性が高いため、大幅な改善が見られます。

于 2012-07-27T07:33:34.297 に答える