現在 2.5 秒で実行されている MySQL クエリがあり、最大 2 秒に短縮したいと考えています。
クエリは次のとおりです。
SELECT SQL_CALC_FOUND_ROWS Distinct(c.id)
FROM `content` c
INNER JOIN `actions` AS action
ON c.parent_id = action.primary_id
WHERE 1 = 1
AND c.site_id IN ( 1, 2 )
AND c.type IN ( 'topic' )
AND c.status = 'visible'
AND ( c.lock = 0
OR c.site_id = 1 )
AND ( c.level IN ( 0 )
OR ( c.level IN ( 10 )
AND action.user_id = 123
AND action.type IN ( 'group_follow' ) ) )
ORDER BY c.date_updated DESC
LIMIT 20
現在の統計は次のとおりです。
- テーブル コンテンツには 55,000 行あります
- テーブル アクションには 87,000 行あります
コンテンツについては、次のインデックスがあります。
- 親 ID (親 ID)
- ユーザー ID (ユーザー ID)
- type_status_date (タイプ、ステータス、日付)
- type_status_updateddate (タイプ、ステータス、date_updated)
- サイト_id (サイト_id)
- type_status_level (タイプ、ステータス、レベル)
- type_parentid_level (タイプ、親 ID、レベル)
アクションについては、次のインデックスがあります。
- primary_id (プライマリ ID)
- サイト_id (サイト_id)
- タイプ(タイプ)
どんな助けや提案も大歓迎です。
皆さんありがとう!