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

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

ただいまの
回答率

87.48%

SQLで複数テーブル間で、同一のインデックス名を付けるというのはアリですか?

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 2,226

score 2

知りたいこと

schoolsとmensというテーブルがあり、これを検索するとき必ずurlのカラムを使います

その場合、以下のようにテーブルをまたいて同じ「idx_url」というインデックス名にするのはアリでしょうか

create table schools (
     id         int(10)       not null auto_increment,
     school     varchar(4)    not null,
     url        varchar(100)  not null,
     index idx_url(url),
     primary key(id));

create table mens (
     id         int(10)       not null auto_increment,
     coolness   varchar(4)    not null,
     url        varchar(100)  not null,
     index idx_url(url),
     primary key(id));


それとも以下のように「idx_schools_url」と「idx_mens_url」と別々のインデックス名にする方がいいでしょうか

create table schools (
     id         int(10)       not null auto_increment,
     school     varchar(4)    not null,
     url        varchar(100)  not null,
     index idx_schools_url(url),
     primary key(id));

create table mens (
     id         int(10)       not null auto_increment,
     coolness   varchar(4)    not null,
     url        varchar(100)  not null,
     index idx_mens_url(url),
     primary key(id));

自分の考え

インデックスは少ない方がいいという知識しかないために前者にしようと思っています

ですが「別テーブルで同一インデックス」というのが邪道じゃないか心配です

何か不具合が起きやすいとか、使いにくいなどございませんでしょうか?

実際の実行コード

SELECTは以下のように「url='gf80'」というwhereで2つのテーブルの検索する場合を想定しています

create table schools (
     id         int(10)       not null auto_increment,
     school     varchar(4)    not null,
     url        varchar(100)  not null,
     index idx_url_schools(url),
     primary key(id));

insert into schools (id, school, url)
values
(1, '梅高', '27qM'), (2, '竹高', 'ujCx'), (3, '松校', '3Ut2'), (4, '松校', '5yHQ')
;

create table mens (
     id         int(10)       not null auto_increment,
     coolness   varchar(4)    not null,
     url        varchar(100)  not null,
     index idx_url_mens(url),
     primary key(id));

insert into mens (id, coolness, url)
values
(1, 'イケメン', 'JBVj'), (2, '塩顔', 'gf80'), (3, '王子様', 'TQKe'), (4, '王子様', 'iiac')
;

SELECT *
FROM   schools
WHERE  url='gf80'
UNION ALL
SELECT *
FROM   mens
WHERE  url='gf80';    
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+2

インデックスは少ない方がいいという知識しかないために前者にしようと思っています

容量や更新のオーバーヘッドという点では、共有できるものは纏めるというのは意味があります。

ですが「別テーブルで同一インデックス」というのが邪道じゃないか心配です

何か不具合が起きやすいとか、使いにくいなどございませんでしょうか?

それと、インデックス名は別な話です。
実行計画上では判断が付かなくなるので、全体で固有の名称になるようにした方が良いでしょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/05/07 19:54

    すみません確認が遅れました。ご回答ありがとうございます。
    固有の名称といいますとやはり質問にあるまま「idx_schools_url」と「idx_mens_url」でよさそうでしょうか。
    その場合ですが、テーブル名が長かったりするのですが「idx_テーブル名_カラム名」の「テーブル名」は略したりせずに正確に書いた方がいいでしょうか?

    キャンセル

  • 2020/05/07 20:03

    複数項目によるインデックスもありますから、カラム名は名称に含めない方が良いかと思います。
    テーブル名+連番程度で良いと思いますけど。

    キャンセル

  • 2020/05/07 20:14

    コメントありがとうございます。連番ですか!?「idx_schools_url」と「idx_mens_url」ならば「idx1_schools」と「idx1_mens」としておき、もし他にschoolsテーブルに他のインデックスが生じた場合「idx2_schools」になるというイメージですか?たしかにカラム名にしては後々困るところでした。アドバイス助かりました。

    キャンセル

checkベストアンサー

+1

MySQLの場合、INDEXの管理がテーブル単位になりますので、複数テーブルに対して同名のINDEXをつけるのは可能ですし、特に邪道でもありません。
ちなみに、MySQL以外のDBですと、INDEXの管理が「DB単位」になっているものもあります(SQLServerなど)。そういう場合は、複数テーブルに対して同名INDEXをつけようとするとエラーになります。

ただ

インデックスは少ない方がいいという知識しかないために前者にしようと思っています

この観点では、同名にしてもあまり意味がないかと思われます。
というのは、名前が一緒だとしても「それぞれのテーブルの、たまたま同じ名前のINDEX」というだけなので、インデックスの数は少なくならないためです。
(「1年1組のたなかさん」と「2年1組のたなかさん」は、同名ですが、1人ではありませんよね?)

「INDEXの名前をカラム名準拠にして、簡潔にしたい」等の理由であれば、同名にする意味はあるかと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/05/07 01:12

    同じ名前にしたら1つのインデックスになってくれるのかと思っていました…
    夜分にありがとうございました!

    キャンセル

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

  • ただいまの回答率 87.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る