[site_list] ~100,000 行... 10 MB のサイズ。
- site_id
- サイトのURL
- site_data_most_recent_record_id
[site_list_data] ~ 1,500 万以上の行と成長中... サイズは約 600 MB です。
- record_id
- site_id
- site_connect_time
- サイト速度
- date_checked
太字の列は一意のインデックス キーです。
最近更新された 50 のサイトと、それに付随する最近のデータ (接続時間、速度、日付) を返す必要があります。
これが私のクエリです。
SELECT SQL_CALC_FOUND_ROWS
site_list.site_url,
site_list_data.site_connect_time,
site_list_data.site_speed,
site_list_data.date_checked
FROM site_list
LEFT JOIN site_list_data
ON site_list.site_data_most_recent_record_id = site_list_data.record_id
ORDER BY site_data.date_checked DESC
LIMIT 50
ORDER BY と SQL_CALC_FOUND_ROWS (ページネーションに必要) がなければ、クエリは約 1.5 秒かかり、2 秒以上かかるクエリは十分ではありません。このデータが表示される特定のページは 20K+ ページビュー/日とこのクエリは明らかに重すぎて(これをライブにするとサーバーがほとんど死にます)、遅すぎます。
mySQL の専門家、あなたならどうしますか? テーブルが 1 億レコードに達したらどうなるでしょうか? この巨大な結果を 30 秒ごとに一時テーブルにキャッシュすることが、私が得た他の唯一の解決策です。