1

我正在使用对四个表执行三个表连接的 MySQL 查询。其中两个连接在一对 MUL 键上。第三个连接是在一对主键上。查询需要整整一分钟才能获取 100 行。

我相信两对 MUL 密钥都是独一无二的;所以我想知道,如果这些键被索引为唯一的,或者被制成外键,我会注意到显着的性能提升吗?

MUL 键上的连接可能是这里的罪魁祸首吗?

编辑

好的,这是架构。我用字母代替了实际的表/列名。

mysql> 描述表 A;
+-----------------+------------------+------+--- --+---------+----------------+
| 领域 | 类型 | 空 | 钥匙 | 默认 | 额外 |
+-----------------+------------------+------+--- --+---------+----------------+
| 键 | int(10) 无符号 | 否 | 优先级 | 空 | 自动增量 |
| 麦键 | int(10) 无符号 | 否 | 穆尔 | 空 | |
| 一个 | int(10) 无符号 | 否 | | 空 | |
| 乙 | int(10) 无符号 | 否 | | 空 | |
mysql>描述表B;
+-----------------+------------------+------+--- --+---------+----------------+
| 领域 | 类型 | 空 | 钥匙 | 默认 | 额外 |
+-----------------+------------------+------+--- --+---------+----------------+
| 键 | int(10) 无符号 | 否 | 优先级 | 空 | 自动增量 |
| mkey1 | int(10) 无符号 | 否 | 穆尔 | 空 | |
| mkey2 | int(10) 无符号 | 否 | 穆尔 | 空 | |
| 一个 | int(10) 无符号 | 否 | | 空 | |
| 乙 | int(10) 无符号 | 否 | | 空 | |
| c | int(10) 无符号 | 否 | | 空 | |
mysql>描述表C;
+---------------+------------------+------+-----+- --------+--------+
| 领域 | 类型 | 空 | 钥匙 | 默认 | 额外 |
+---------------+------------------+------+-----+- --------+--------+
| 键 | int(10) 无符号 | 否 | 优先级 | 空 | |
| 麦键 | varchar(128) | 否 | 穆尔 | 空 | |
mysql> 描述表 D;
+---------------+------------------+------+-----+- --------+--------+
| 领域 | 类型 | 空 | 钥匙 | 默认 | 额外 |
+---------------+------------------+------+-----+- --------+--------+
| 键 | int(10) 无符号 | 否 | 优先级 | 空 | |
| 麦键 | varchar(128) | 否 | 穆尔 | 空 | |

询问:

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 回答