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

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

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

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

Q&A

3回答

458閲覧

MySQLのインデックスの使われ方について

teratailmacr2

総合スコア31

MySQL

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

0グッド

1クリップ

投稿2018/11/29 05:33

TABLE : customer

idnameageinsert_atupdate_at
1鈴木182018-11-28 10:00:002018-11-29 18:00:00
2佐藤202018-11-28 21:00:002018-11-29 18:00:00
3渡辺232018-11-29 15:00:002018-11-29 18:00:00

INDEX :

キー名カラム
PRIMARYid
index_ageage
index_insert_atinsert_at

MySQLは1テーブルにつき1インデックスしか使用されないと聞きます。

テーブルを作成する際、プライマリーキーには自動的にインデクスが貼られるかと思いますが、下記の様なSQLにはPRIMARYインデックスは使われないのでしょうか?

SELECT * FROM customer WHERE age >= 20 ORDER BY id DESC

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

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

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

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

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

guest

回答3

0

あれこれ悩むぐらいなら、まずはEXPLAINしてみましょう。

ごく小さな表の場合、全部読んでも負担にならないということで、インデックスなしで処理されることもあります。また、age >= 20を満たすカーディナリティ次第で状況も変化します(ほとんどがage >= 20であれば、id順で見て違うのを除外していったほうが効率的なので、そのようにしょりされる可能性もあります)。

投稿2018/11/29 05:39

maisumakun

総合スコア145183

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

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

teratailmacr2

2020/07/01 06:06

ご回答ありがとうございます。 条件により結果が変わる為、この場合は必ずこれ!と言う解はないので答えられないと言う事でしょうか?
guest

0

PRIMARY KEY に張られたインデクスが使用されるのは、where の条件に PRIMARY KEY に関わるものがある場合です。

SQL

1SELECT * FROM customer WHERE age >= 20 ORDER BY id DESC

この場合なら PRIMARY KEY は WHERE に出てきませんから実行計画から考えても出てきません。

使用される可能性があるのは index_age ですが、age >= 20 であるレコードの方が多い場合など、index を使うとかえって遅くなる場合があり得るので、常に使うとは限りません。

※index を使ってレコードを取得する場合、インデックスを調べてレコードのユニークIDを得る→そのレコードを取得していく(ランダムリード)、となるため、全件を一度一気に読み込んで(シーケンシャルリード)から対象外を振り落とす full scan した方が(ストレージへのアクセス的に)早い場合があります

投稿2020/07/01 06:17

tacsheaven

総合スコア13703

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

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

teratailmacr2

2020/07/01 06:41 編集

ご回答ありがとうございます。 なるほど。 と言う事は、ageとidに対して複合インデックスを貼っておくのが最適解と言う事でしょうか? (ageのみはいらない?) ただそれが実際に使われるかどうかはカーディナリティの低さによって変わると言う事でしょうか。
tacsheaven

2020/07/01 06:45

age のみのインデックスに意味はあるかと言うことですが、それはデータの分布によるのです。 例えば age >= 20 では full scan になったとしても、逆の age < 20 なら index scan になる可能性があります。age = 20 ならインデックスが使われるでしょう(データのほとんどが age = 20 とかでない限り)。 複合インデックスを張ったとしても使われるのは where 条件が複合する場合に限られますので、あまり意味はないでしょう(その場合でも必ず使うとは限らない) 経験則としては、全体の一割以下まで絞り込むことが可能な抽出条件の組み合わせが可能であれば、それについてはインデックスがあってもよいかとは思います。ただこれも母数となるレコード数によります。
teratailmacr2

2020/07/01 12:57

order句にもindexは使わるとありますので、ageとidの複合indexを貼っておけばwhereのageにもorder byのidにもインデックスが使われるし、ageだけの時も使われるし、逆にageに使われなかった場合はPRIMARY KEYが使われるので、ageだけのindexは必要ないと言う事にはならないのでしょうか?(例のSQLしか使わない場合)
guest

0

実行計画を確認 することでインデックスが使われているかわかります。

投稿2018/11/29 05:39

Orlofsky

総合スコア16415

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問