1

4つのテーブルで3つのテーブル結合を行うMySQLクエリを使用しています。これらの結合のうちの2つは、MULキーのペアにあります。3番目の結合は、主キーのペアで行われます。クエリは100行を取得するのに1分かかります。

MULキーの両方のペアは一意であると思います。したがって、これらのキーが一意としてインデックス付けされるか、外部キーにされる場合、パフォーマンスが大幅に向上することに気付くでしょうか。

MULキーの結合は、ここでの原因である可能性がありますか?

編集

さて、これがスキーマです。実際のテーブル/列名を文字に置き換えました。

mysql>記述テーブルA;
+ ------------------- + ------------------ + ------ + --- -+ --------- + ---------------- +
| フィールド| タイプ| ヌル| キー| デフォルト| エクストラ|
+ ------------------- + ------------------ + ------ + --- -+ --------- + ---------------- +
| pkey | int(10)unsigned | いいえ| PRI | NULL | auto_increment |
| mkey | int(10)unsigned | いいえ| MUL | NULL | |
| a | int(10)unsigned | いいえ| | NULL | |
| b | int(10)unsigned | いいえ| | NULL | |
mysql>記述テーブルB;
+ ------------------- + ------------------ + ------ + --- -+ --------- + ---------------- +
| フィールド| タイプ| ヌル| キー| デフォルト| エクストラ|
+ ------------------- + ------------------ + ------ + --- -+ --------- + ---------------- +
| pkey | int(10)unsigned | いいえ| PRI | NULL | auto_increment |
| mkey1 | int(10)unsigned | いいえ| MUL | NULL | |
| mkey2 | int(10)unsigned | いいえ| MUL | NULL | |
| a | int(10)unsigned | いいえ| | NULL | |
| b | int(10)unsigned | いいえ| | NULL | |
| c | int(10)unsigned | いいえ| | NULL | |
mysql>記述テーブルC;
+ --------------- + ------------------ + ------ + ----- +- -------- + ------- +
| フィールド| タイプ| ヌル| キー| デフォルト| エクストラ|
+ --------------- + ------------------ + ------ + ----- +- -------- + ------- +
| pkey | int(10)unsigned | いいえ| PRI | NULL | |
| mkey | varchar(128)| いいえ| MUL | NULL | |
mysql>記述テーブルD;
+ --------------- + ------------------ + ------ + ----- +- -------- + ------- +
| フィールド| タイプ| ヌル| キー| デフォルト| エクストラ|
+ --------------- + ------------------ + ------ + ----- +- -------- + ------- +
| pkey | int(10)unsigned | いいえ| PRI | NULL | |
| mkey | varchar(128)| いいえ| MUL | NULL | |

クエリ:

select
A.a, A.b, B.c, A.mkey, C.pkey, D.mkey
from
A, B, C, D
where
A.pkey=C.pkey and
A.mkey=B.mkey1 and
B.mkey2=D.pkey and
B.a <= A.a and
B.b >= A.b
D.mkey in ('str1', 'str2', ...);

77行を返します。

4

1 に答える 1

0

明示的な結合を使用する

select
A.a, A.b, B.c, A.mkey, C.pkey, D.mkey
from
A INNER JOIN C ON (A.pkey = C.pkey)
INNER JOIN B ON (A.mkey = B.mkey1)
INNER JOIN D ON (B.mkey2 = D.pkey)
where
B.a <= A.a and
B.b >= A.b
D.mkey in ('str1', 'str2', ...);
于 2013-02-23T21:46:06.977 に答える