3

テーブルが数千行を超えるまでクライアントで正常に機能していたこのクエリ(私は書いていません)がありますが、現在は4200行だけで40秒以上かかります。

最適化して同じ結果を得る方法に関する提案はありますか?

他のいくつかの方法を試しましたが、この遅いクエリが返す正しい結果が得られませんでした...

SELECT COUNT(*) AS num
  FROM `fl_events`
  WHERE id IN(
    SELECT DISTINCT (e2.id)
      FROM `fl_events` AS e1, fl_events AS e2
      WHERE e1.startdate >= now() AND e1.startdate = e2.startdate
  )
  ORDER BY `startdate`

どんな助けでも大歓迎です!

4

3 に答える 3

5

IN必要な明らかなインデックスは別として、条件を選択するためにテーブルをそれ自体と結合する理由がよくわかりません。ORDER BYも必要ありません。クエリを次のように書くことはできませんか?:

SELECT COUNT(*) AS num
FROM `fl_events` AS e1
WHERE e1.startdate >= now() 
于 2012-06-06T20:46:54.253 に答える
0

速度が遅いのは、おそらくイベント テーブルとそれ自体の結合に関連しており、startdate にインデックスがない可能性があります。

于 2012-06-06T20:42:20.400 に答える
0

クエリを書き直しても役に立たないと思います。あなたの質問の鍵は、「テーブルが数千行を超えるまで」です。これは、重要な列がインデックス化されていないことを意味します。特定の数のレコードより前では、すべてのデータが 1 つのメモリ ブロックに収まります。その時点を超えると、新しいブロックが必要になります。インデックスは、検索を高速化する唯一の方法です。

まず、fl_events の ID が実際に主キーとしてマークされていることを確認します。これはレコードを物理的に並べ替えるものであり、それがないと、データが破損したり、場合によっては結果が非常に遅くなったりする可能性があります。クエリでdistinctを使用すると、一意の値ではないように見えます。それが問題になります。

次に、必ず start_date にインデックスを追加してください。

于 2012-06-06T20:41:15.167 に答える