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

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

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

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

4回答

16035閲覧

10万レコードある、booleanのカラム(edit_flag)に対して、whereで絞り込む機会が多い場合、indexをつけた方が宜しいでしょうか?

qaz3330

総合スコア113

MySQL

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2016/09/21 14:58

業務要件上MySQLをしようしております。

100,000件以上レコードのあるテーブルにおいて、とあるbooleanのカラム(edit_flag)をもとに画面上からwhereで絞り込むことが多いです。

一般的にレコード数が多く、かつ、whereなどで検索するようなカラムはindexを付与した方がいいかと思いますが、

booleanのような2値のカラムに対しましては、どうなのかわかりません。

現在は100,000件ほどですが、月に10,000件ぐらいのペースで増えていきます。

宜しくお願いします。

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

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

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

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

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

guest

回答4

0

インデックス設計はケースバイケースです。
とは言えまぁ検索するのにインデックスを全く作らないということは考え難いため、
なんらかのインデックスは必要でしょう。

データが2値だとしても、

  • 殆どtrueで僅かにfalseのレコードやその逆のパターンかどうか
  • edit_flag以外の検索条件の有無

など考慮するべき点は色々思い付きます。
場合によってはカバリングインデックスを利用できることがあるかも知れません。
実行計画も確認しながら検索クエリのパターンを洗い出した後、
それに見合うインデックスを必要な数だけ用意しましょう。

投稿2016/09/21 15:32

nakit

総合スコア410

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

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

0

今回と似たようなケースとしてこちらのQAで、
過去に同様に2値の値しか取らないケースでのインデックス適用可否についてやり取りされています。
上記QAの回答も合わせて参照すると有益かと思われます。

既に他の回答者さんも述べいますが、
「edit_flag」列単体でみるとデータが大きく偏りがあるケースを除くと、
インデックスの効果は見込めないというのが一般論です。
(偏りがなかったり少ないと、DBMS側もインデックスを利用しないスキャンの方が早いと判断するみたい。
加えて偏りが大きくても量の多い方で検索をあけるとこれもフルスキャンされる模様。)

「edit_flag」列以外の列も合わせて考えると、
良く利用される検索パターン(xxxx_codeとedit_flag)とかがある場合は、
それらの列に対して複合インデックスとして定義すると検索効率の向上が見込めることはあると思います。

ただし、あくまで一般論なので、
実際どのようにインデックスが利用されているかなどを、
実行計画と睨めっこして確認する必要はあることに注意して下さい。

投稿2016/09/22 04:15

編集2016/09/22 04:22
Panzer_vor

総合スコア1636

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

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

0

番号、日付、担当者、所有者、相手先、等々 カラム名,COUNT(*) でレコード数が多いことを目安に
インデックスを付けています。
もしも、スピード最優先なSQLがあれば、だめもとで副問い合わせをtemporaryテーブルに分離してあえて複数のSQLに分割してみると速くなることもあります。
副問合せとは (SELECT ... FROM ベーステーブル WHERE ... ) tmp のようにSQL の中で、カッコ付きのSELECT 文の箇所のことです。

投稿2016/09/21 18:25

km668

総合スコア65

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

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

0

その boolean がよっぽど偏ってない限りインデックスを付けても意味はありません。MySQL のインデックスは木構造にデータを分類することで検索速度をあげますが、boolean では木の枝が2本しかなくスピードがあがりません。

ただし、片方の値が希少でそちらの値を持つものだけを抽出したいのであれば、意味があるかもしれません。

現在は100,000件ほどですが、月に10,000件ぐらいのペースで増えていきます。

今のコンピュータですと、このくらいの件数では、よっぽど下手を打たないと性能問題になりません。普通に他のフィールドにインデックスをつけて検索できているのであれば、その boolean のカラムはほっておいていいでしょう。

投稿2016/09/21 15:41

mit0223

総合スコア3401

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問