PHP+MySQLでPDOを使用してデータベースを運用しています。
マイナーですが、そこそこユーザー数を抱えた質問箱のようなサービスです。
今回、1つの大容量テーブル(以下テーブルA)に関してクエリの改善をしたいと思い、是非ご意見を伺いたく投稿させて頂きます。
現在の状況を箇条書きにて説明します。特定防止のため具体的なデータを出せない点はご容赦ください。
現在の状況
- テーブルAは約20万行のデータ有
- 1日に約5000件のINSERT及びUPDATEが行われる。INSERTとUPDATEは一括ではなく1行毎に行う(2行以上挿入及び更新するクエリはほぼない)
- 一か月毎にデータをローカルに保存し、テーブルAを空にするので、多くても最大行は30万ほどになる。
- ページング処理を行い、LIMITで50件毎のデータを表示している
- LIMITで取り出すデータのWHERE句及び、ソート方法に、(col1 + col2)などのカラム演算が入っているため、フルテーブルスキャンが必須となってしまっている(EXPLAINのtypeはAllでrowは20万件)
- クエリ自体の実行速度0.1秒。負荷がかかっているとサーバー会社から連絡が入った。
今やろうと考えている事
- 今演算結果で比較を行っているWHEREとORDER BYを、検索用のカラムを追加し、そのカラムにインデックスを付与する
抱いている懸念
- インデックスがあるテーブルで挿入及び更新が頻発すると処理コストが増す、という未だ体感できていない定説によって、そもそもインデックス処理を施すべきか悩んでいます。
行の挿入と更新は、1行単位で1日5000~10000ほど頻繁に行われます。追加する検索用のインデックスカラムも更新の対象となります。
ただ、SELECTによる呼び出しは、1日8万回も行っているため、その度にフルテーブルスキャンを行うよりかはマシかな…?などと堂々巡りをしております。
質問にあたって参考にした質問
https://teratail.com/questions/111667
こちらの方とはデータ量と更新頻度に差があるので、改めて質問させて頂きたく思いました。
ご回答いただきたいこと
一部曖昧な仕様のお伝えで申し訳ないですが、このテーブルAにインデックスを付けるべきか、逆効果になる可能性が高いか、のご意見を伺いたいです。
やってみないと分からないだろ、というご意見は仰る通りなのですが、掲示した状況からの推測で構いません。
※「そもそもサービスの仕組みがおかしいのでは?」というそもそも論もあるかと思いますが、説明しなくてはいけない仕様が増えて今回の質問のみで対応するのは難しいので、今回はインデックスの判断に関して回答を頂きたいです。
回答2件
あなたの回答
tips
プレビュー