1億レコードのテーブルから期日を指定して件数を確認し削除したいのですが
件数が多いためCOUNT(*)を行うとフルスキャンになってしまいDBに負荷がかかるのを懸念しています。
日付指定を行う想定でなかったため、指定カラムにインデックスは張られて無いです
→ご認識の通り、指定カラムにインデックスが貼られていないのであれば、DBに負荷がかかります。
日付指定で効率的に件数をカウントする方法は無いでしょうか?
→上記の理由により、日付指定では無理です。
最終的に対象日付以前を削除するので、数千万単位のdeleteを行うのでこちらも同様にパフォーマンスを落とさないで削除する方法があれば知りたいです
→まず、「対象日付以前を削除」が何件で、「対象日付以降」は何件ですか?
(案1)削除ではなく、主キーベースで必要なデータを新しいテーブルに移行する。
「対象日付以降」が数百万件であれば、
ちゃんとカラムにインデックスを貼ったテーブルや、
パーティショニングを考慮したDB設計をしてテーブルを作成した後、
作成したテーブルに「対象日付以降」のデータを移行し、元のテーブルはバックアップとして残しておく。
(日付指定ではなく、主キー指定で判断できることが前提)
(案2)(どのように作られたデータか不明ですが)
新しく設計されたテーブルに1億レコードを作り直す。
(案3)カウントしてみる。
⇒「COUNT(*)」では、確実にNGなので、SELECT COUNT('X') FROM test; であれば、
統計データから抽出される(テーブルの構造によっては、可能性がある)ため、実行してみる。
もしくは、explain SELECT COUNT('X') FROM test;
(日付指定は不可)
(案4)数千万単位のdeleteを行うのでこちらも同様にパフォーマンスを落とさないで削除する方法
⇒他のパフォーマンスを気にされているとの事なので、
主キー指定で、100~1000件ずつの削除であれば、時間はかかりますが、
他への影響は少なく出来るかと思います。
<まとめ>
「指定カラムにインデックスは張られて無い」とのことですが、
他のカラムには付いてるのかすら、こちらは不明なので、
テーブル構造を開示する事をお勧めします。
開示できない場合は、専門の方に費用を払って、依頼するのが良いです。
専門の方に依頼すれば、以下のような情報を基に、適切な対処を行えるハズです。
・どのように追加・削除されているテーブルなのか。
・テーブルの設計思想は。
・MySQLの設定情報は。
・実行計画は。
・断片化はどうなってるか。
・運用と環境は。
・MySQLのバージョンは。
etc...
(※上記の開示を求めているわけではないです)