SELECT count(*) c FROM full_view WHERE verified > ( DATE (NOW()) - INTERVAL 30 DAY)
そのクエリを実行すると一瞬かかりますが、比較演算子を切り替えると何百年もかかります。最初の方法ではカウント = 0、2 番目の方法ではカウント = 120000 ですが、テーブル全体をカウントすると、マイクロ秒もかかります。
しかし、クエリが終了した場合、その後は非常に高速に実行されるため、何か奇妙なことが起こっています。MySQL はクエリまたは何かをキャッシュしていますか? Web サイトがハングアップしないようにするためにキャッシュに依存したくありません。
これは無意味に思えます: 特定の日付よりも後のすべてをすばやくカウントできる場合、反対の日付をカウントするのになぜこれ以上時間がかかるのでしょうか? いずれにせよ、テーブル全体を見なければなりませんよね?また、返す必要があるのは数値だけなので、帯域幅は問題になりません。
クエリについて説明します。
1, 'SIMPLE', 'b', 'range', 'updated,verified_index', 'updated', '3', '', 28, 'Using where'`
1, 'SIMPLE', 'l', 'eq_ref', 'PRIMARY', 'PRIMARY', '4', 'xyz_main.b.loc_id', 1, 'Using index'
1, 'SIMPLE', 'f', 'ALL', '', '', '', '', 2214, ''
編集:
これは興味深いかもしれません。クエリを実行すると、次の情報が見つかりました。
Handler_read_rnd_next:
- 254436689 (未満の場合)
- 2 (より大きい)
Key_read_requests: 314393 対 33 (より大きい値を使用する場合、33 はすべての統計の最大数です)
Handler_read_key: 104303 対 1
ビューをバイパスし、クエリをメイン テーブルで直接実行すると、速度が低下しなくなります。では、高速化するにはどうすればよいでしょうか。ビューは基本的に次のようになります。
SELECT x, y, z, verified FROM table1 LEFT JOIN table2 on tab2_ID = table2.ID LEFT JOIN table3 on tab3_ID = table3.ID
解決済み: フランキーは私を正しい方向に導きました。2 番目の結合テーブル (会社テーブル) は、会社のフルテキスト名を介して結合されました。そのテーブルに整数キーを追加することにしたのはつい最近のことです。name 列はインデックス化されるはずでしたが、それを失敗した可能性があります。とにかく、私はすべてを再編成しました。メイン テーブルの外部キーを、完全な会社名ではなく会社テーブルの整数 ID に一致するように変換しました。各テーブルでこれらの列のインデックスを再作成し、新しい結合ポイントを反映するようにビューを更新しました。これで、両方向に即座に実行されます。:) だから、整数キーが鍵だったと思います。問題は解決しましたが、元の質問が本当に解決されたようには感じません。
助けてくれてありがとう。