Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用适当的主键和索引对相对较小的表执行缓慢的MySQL查询_Mysql_Performance_Join - Fatal编程技术网

使用适当的主键和索引对相对较小的表执行缓慢的MySQL查询

使用适当的主键和索引对相对较小的表执行缓慢的MySQL查询,mysql,performance,join,Mysql,Performance,Join,我在3个表上有一个select语句;T1和T2可以连接,T2和T3可以连接。T3是一个只有42行的表。T2非常巨大,大约40亿行,T1是75万条记录。我想要的是,对于T1中的所有记录,我想要从T3获取相关数据 如果我对所有3个表执行如下连接,则查询需要很长时间才能运行: select T1.A, T2.B, T3.C, T3.D from T1, T2, T3 where T1.A = T2.A and T1.B = T2.B and T2.C = T3.C 但是如果我从查询中去掉T3,查

我在3个表上有一个select语句;T1和T2可以连接,T2和T3可以连接。T3是一个只有42行的表。T2非常巨大,大约40亿行,T1是75万条记录。我想要的是,对于T1中的所有记录,我想要从T3获取相关数据

如果我对所有3个表执行如下连接,则查询需要很长时间才能运行:

select T1.A, T2.B, T3.C, T3.D from 
T1, T2, T3 where T1.A = T2.A 
and T1.B = T2.B and T2.C = T3.C
但是如果我从查询中去掉T3,查询运行得更快。我还使用
EXPLAIN
查找查询路径。看起来T3正在进行全表扫描。i、 e,键列为空

那么,我的问题是,它为什么这样做

T3有一个主键,它是一个相对较小的表。我的整个查询是否很慢,因为在T1和T2连接之后,对于所有剩余的记录,它正在使用T3进行全表扫描?因此,如果在T1和T2连接之后有700000条记录,那么对于这700000条记录中的每一条,它都在完全扫描T3表。这就像是做700000 x 42扫描


更新

为了便于理解,我将原来的表名替换为T1、T2、T3。但我的实际问题是:

select vc.vkey, vc.enst, vi.`effect_code`, te.effect, te.impact
from Variants vc, var_RVS.variant_impact vi, var_RVS.`types_effects` te
where vi.effect_code = te.eid
and vc.vkey = vi.vkey 
下面是explain语句的输出:

+----+-------------+-------+------+-------------------------------------+-------------+---------+---------------------------------+------+-------------+
| id | select_type | table | type | possible_keys                       | key         | key_len | ref                             | rows | Extra       |
+----+-------------+-------+------+-------------------------------------+-------------+---------+---------------------------------+------+-------------+
|  1 | SIMPLE      | te    | ALL  | PRIMARY                             | NULL        | NULL    | NULL                            |   42 | NULL        |
|  1 | SIMPLE      | vi    | ref  | canonical_enst,vkey_idx,effect_code | effect_code | 4       | var_RVS.te.eid                  |  981 | Using where |
|  1 | SIMPLE      | vc    | ref  | allVsAllXref,vkey_enst              | vkey_enst   | 788     | var_RVS.vi.vkey,var_RVS.vi.enst |    1 | Using where |
+----+-------------+-------+------+-------------------------------------+-------------+---------+---------------------------------+------+-------------+

除非T3.C上有索引,否则它必须扫描所有T3以找到满足
T2.C=T3.C
的记录。这与钥匙无关;考虑到您当前的模式(据我所知),没有其他方法可以找到满足此要求的记录。

最坏情况下,输出将是750K*4B*42=126万亿行

EXPLAIN
估计42*981*1=4万行

如果存在
vi.effect\u code=te.eid
没有匹配行的情况,则可以使用较小的数字

您没有筛选出行的内容。你期待什么

EXPLAIN显示每个阶段都有合适的索引,因此查询速度尽可能快

“慢”有多慢?
您得到了多少行?

您能发布您的解释结果吗?模式也会很有用。[A,B]是复合主键吗?尝试在该语法中使用联接而不是SQL。有什么证据表明
te
(`T3
?)有任何索引,或者
eid`(
C
?)是主键吗?我查看了T3的表结构,并在T3上运行了“显示索引”。T3.C是主键,也是索引。@ayesandarmoe:你认为这不相关吗?