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

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

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

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

SQL

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

Q&A

解決済

2回答

5713閲覧

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

moriazarashi

総合スコア2

MySQL

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

SQL

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

0グッド

0クリップ

投稿2020/05/06 15:56

知りたいこと

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

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

sql

1create table schools ( 2 id int(10) not null auto_increment, 3 school varchar(4) not null, 4 url varchar(100) not null, 5 index idx_url(url), 6 primary key(id)); 7 8create table mens ( 9 id int(10) not null auto_increment, 10 coolness varchar(4) not null, 11 url varchar(100) not null, 12 index idx_url(url), 13 primary key(id));

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

SQL

1create table schools ( 2 id int(10) not null auto_increment, 3 school varchar(4) not null, 4 url varchar(100) not null, 5 index idx_schools_url(url), 6 primary key(id)); 7 8create table mens ( 9 id int(10) not null auto_increment, 10 coolness varchar(4) not null, 11 url varchar(100) not null, 12 index idx_mens_url(url), 13 primary key(id));

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

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

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

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

sql

1create table schools ( 2 id int(10) not null auto_increment, 3 school varchar(4) not null, 4 url varchar(100) not null, 5 index idx_url_schools(url), 6 primary key(id)); 7 8insert into schools (id, school, url) 9values 10(1, '梅高', '27qM'), (2, '竹高', 'ujCx'), (3, '松校', '3Ut2'), (4, '松校', '5yHQ') 11; 12 13create table mens ( 14 id int(10) not null auto_increment, 15 coolness varchar(4) not null, 16 url varchar(100) not null, 17 index idx_url_mens(url), 18 primary key(id)); 19 20insert into mens (id, coolness, url) 21values 22(1, 'イケメン', 'JBVj'), (2, '塩顔', 'gf80'), (3, '王子様', 'TQKe'), (4, '王子様', 'iiac') 23; 24 25SELECT * 26FROM schools 27WHERE url='gf80' 28UNION ALL 29SELECT * 30FROM mens 31WHERE url='gf80';

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

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

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

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

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

guest

回答2

0

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

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

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

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

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

投稿2020/05/07 01:12

sazi

総合スコア25138

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

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

moriazarashi

2020/05/07 10:54

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

2020/05/07 11:03

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

2020/05/07 11:14

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

0

ベストアンサー

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

ただ

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

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

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

投稿2020/05/06 16:08

nak

総合スコア696

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

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

moriazarashi

2020/05/06 16:12

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問