使用适当的主键和索引对相对较小的表执行缓慢的MySQL查询
我在3个表上有一个select语句;T1和T2可以连接,T2和T3可以连接。T3是一个只有42行的表。T2非常巨大,大约40亿行,T1是75万条记录。我想要的是,对于T1中的所有记录,我想要从T3获取相关数据 如果我对所有3个表执行如下连接,则查询需要很长时间才能运行:使用适当的主键和索引对相对较小的表执行缓慢的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,查
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:你认为这不相关吗?