1

[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 秒ごとに一時テーブルにキャッシュすることが、私が得た他の唯一の解決策です。

4

3 に答える 3

2

クエリにヒューリスティックを追加する必要があります。妥当なパフォーマンスを得るには、クエリをゲートする必要があります。site_list_date テーブルを日付の降順で効果的に並べ替えます - ENTIRE テーブルです。

したがって、トップ 50 が最後の日または最後の週に含まれることがわかっている場合は、「and date_checked > <boundary_date>」をクエリに追加します。次に、最初に全体的な結果セットを減らしてから、並べ替えます。

于 2013-01-27T04:34:44.300 に答える
1

SQL_CALC_ROWS_FOUND は遅いため、代わりに COUNT を使用してください。こちらをご覧ください

于 2013-01-27T05:04:30.693 に答える