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

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

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

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Q&A

解決済

2回答

3621閲覧

created_atやmodified_atにインデックスを貼る意味

octcat

総合スコア13

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

0グッド

1クリップ

投稿2017/06/07 06:17

編集2017/06/07 09:21

###DBのインデックスの貼り方への疑問
お世話になっております。
多対多のcategory_itemsという中間テーブルに置いて

iditem_idcategory_idmodified_atcreated_at
intintinttimestamptimstamp

(category_id,modified_at)のキーペアにインデックスが貼ってあったのですが、
これってパフォーマンス上何か有利になりますか?

意図的には

SQL

1select items.name,items.price from category_items 2left join items on items.id = category_items.item_id 3where category_items.item_id = $category_items.item_id 4order by modified_at asc limit $number

といった感じの処理を早くしたいのかなと思ったのですが、インデックスを貼るとorder byの動作に影響を与えるかどうか気になったので、
教えていただければと思います。

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

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

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

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

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

guest

回答2

0

(category_id,modified_at)のキーペアにインデックスが貼ってあったのですが、
これってパフォーマンス上何か有利になりますか?

たぶん下記の3行に効果での(category_id,modified_at)のキーペアだと思われますが
on区とwhere区ではitem_idですので上記インデックスは使われません
order byでは結果に対する並び替えですので、インデックスは使われないのではないでしょうか。(抽出時に有効です)

left join items on items.id = category_items.item_id
where category_items.item_id = $category_items.item_id
order by modified_at asc limit $number

投稿2017/06/07 11:22

編集2017/06/07 11:36
A.Ichi

総合スコア4070

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

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

octcat

2017/06/08 04:21 編集

ありがとうございます。 キーペアでのクエリを想定していたけど結局使われていなかったか削除されたと推測します。 該当のインデックスは外そうと思います。
guest

0

ベストアンサー

explainで実行計画を取ると分かるかと。

SQLから意図が読み取りにくので、想定になるのですが、
category_idとmodified_atの複合インデックスということなので、
対象のSQLでは効果は得られません。
オプティマイザがいい感じに解釈してくれれば有効かもしれませんが、
order byをcategory_id,modified_atにしたほうが確実です。

中間テーブルということなので、数千件しかないことはないと思われるのですが、
limitをかけない時の件数が3~4千件の場合もインデックスが利用されないので、
パフォーマンスに影響はありません。

余計な詮索ですいませんが、
このSQLですが中間テーブルから全件持ってきて、
最近更新された数件を取得するような処理で間違いないでしょうか。

投稿2017/06/07 08:13

szk.

総合スコア1400

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

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

octcat

2017/06/07 09:24 編集

ありがとうございます。 僕も意味ないのでは、って思っていて >オプティマイザが解釈してくれれば この点でインデックスを貼った方はそういうことを考えていたのかなと推測していますが多分そういう影響もないですよね。 >余計な詮索ですいませんが、 このSQLですが中間テーブルから全件持ってきて、 最近更新された数件を取得するような処理で間違いないでしょうか。 あーすいません。その通りです。クエリを書き間違えていますね。修正します。
szk.

2017/06/08 00:50

order byをcategory_id,modified_atにすると、並び順変わっちゃいますね、すいません。 インデックスを貼った人とSQLを書いた人が別なんじゃないでしょうか。 もしくは別のSQL用のインデックスだという可能性もあるかと思います。 記載のSQLとインデックスは有効に働きません。
octcat

2017/06/08 04:17

承知いたしました。ありがとうございます。 思った通りで安心しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問