質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

654閲覧

検索は1日8万件、挿入+更新は1日1万件のテーブルにインデックスは付けるべき?

sanset

総合スコア186

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2020/02/15 03:21

編集2020/02/15 03:29

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にインデックスを付けるべきか、逆効果になる可能性が高いか、のご意見を伺いたいです。
やってみないと分からないだろ、というご意見は仰る通りなのですが、掲示した状況からの推測で構いません。
※「そもそもサービスの仕組みがおかしいのでは?」というそもそも論もあるかと思いますが、説明しなくてはいけない仕様が増えて今回の質問のみで対応するのは難しいので、今回はインデックスの判断に関して回答を頂きたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/02/15 03:25

「クエリ自体の実行速度は遅くない」と書いてありますが、SELECTの場合、実際何秒程度なのでしょうか?
sanset

2020/02/15 03:27

ありがとうございます。確認したところ0.1秒でした。体感では気付かなかったですが結構遅いですね…。
m.ts10806

2020/02/15 03:28

インデックスが効く検索の仕方、型なのであればすべきですし、効かない検索の仕方、型なのであれば意味なし というくらいのアドバイスしかできませんけど・・。 そういった意味では、説明が必要な仕様もそうですし具体的なテーブル構成が提示されない状態では回答難しいかと。
sazi

2020/02/15 03:40

> クエリ自体の実行速度0.1秒。負荷がかかっているとサーバー会社から連絡が入った。 という事なら、その負荷はSQLの発行回数だと思われますけど?
guest

回答2

0

このテーブルAにインデックスを付けるべきか、逆効果になる可能性が高いか、のご意見を伺いたいです。

インデックスは検索性能を高めるものです。
検索要件があり性能が求められるなら作成するしかありません。

更新時の負荷があるなら工夫が必要ですけど、1件毎で分散されているという事なら、問題は少ないと思います。

かといって、やたらとインデックスを作りすぎるのはよくありません。
コンパクトかつ効果的なインデックスを作りましょう。

LIMITで取り出すデータのWHERE句及び、ソート方法に、(col1 + col2)などのカラム演算が入っているため、フルテーブルスキャンが必須となってしまっている

以下紹介しておきます。
InnoDBにおける仮想列および効果的な"関数インデックス"(MySQL Server Blogより)
インデックスを作れば作るほどinsertが遅くなる
12章 Index Shotgun(闇雲インデックス)

投稿2020/02/15 04:17

編集2020/02/15 04:47
sazi

総合スコア25173

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sanset

2020/02/18 11:49

リンクまで頂きありがとうございます。確認させていただきます。
guest

0

ベストアンサー

1日8万件のリクエストと言うことなので、

80000 / 24時間 / 60分 = 55.5555555556

55 回 / 分 ということですね。ピークタイムを考慮すると、10〜20倍程度のばらつきはあるでしょうから、ギリギリでも1秒あたり 20 リクエストくらいまでは考慮しないといけないでしょう。

目標としては、0.05秒未満くらいでしょうね。

テーブルインデックスについては具体的なクエリや実行計画をみないとアドバイスできませんし、実際にデータを揃えて、試行錯誤して計測する以外にありません。

本番データをエクスポートして、テスト環境で計測することが必要です。

投稿2020/02/15 03:36

編集2020/02/15 03:37
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sanset

2020/02/18 11:48

ありがとうございます。指標の目安を元にチューニングしたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問