MySQL 5.1.73 LEFT JOIN超时

问题描述 投票:1回答:1

我正在使用mysql 5.7.28在本地工作,并且一切正常,但是在5.1.73的开发服务器上,我的请求超时(+ 2mn)。

请求非常简单,但我不明白为什么它不起作用...

SELECT t1.*
FROM t1
LEFT JOIN t2 ON t1.id = t2.id

奇怪的是,如果我要交换t1和t2,则工作正常。如果我使用INNER JOIN,则效果很好。如果我这样做:

SELECT t1.* 
FROM t1 
WHERE t1.id 
NOT IN (
SELECT t1.id 
FROM t1 
INNER JOIN t2 ON t1.id = t2.id)

不起作用。

t1.id和t2.id都有两个索引。t1.id可以为NULL,t2.id不能为NULL(但是在localhost中也是如此?)。

如果您对为什么这种方法不起作用有任何想法,请随时帮助我:D

TABLES:

T1:

`idDossier` bigint(10)
`id` char(11)
`source` varchar(1)
`departementNaissance` varchar(3)
`codeCommuneNaissance` varchar(5)
`uairne` varchar(8)
`sexe` int(1)
`nom` varchar(50)
`prenom` varchar(50) 
`prenom2` varchar(50)
`prenom3` varchar(50)
`dateNaissance` date
`division` varchar(8)
`niveau` varchar(1)
`regimeScolaire` varchar(2)
`dateEntree` date
`dateSortie` date
`exam` int(3)
`autorisation` int(1)
`dateAutorisation` date

索引:

idDossier PRIMARY
id (same than t2.id can be null)
autorisation
codeCommuneNaissance
dateNaissance
nom
prenom
nom
dateNaissance
codeCommuneNaissance

/////////////////////

T2:

`idEleve` int(19)
`id` varchar(11)
`etablissement` varchar(8)
`sexe` int(10)
`nom` varchar(100)
`prenom` varchar(100)
`prenom2` varchar(100)
`prenom3` varchar(100)
`dateNaissance` date
`codeCommuneNaissance` varchar(5)
`departementNaissance` varchar(3)
`adresseEleveLigne1` varchar(50)
`adresseEleveLigne2` varchar(50)
`adresseEleveLigne3` varchar(50)
`adresseEleveLigne4` varchar(50)
`codeCommuneEleve` varchar(5)
`codePostalEleve` varchar(7)
`adresseEleve2Ligne1` varchar(50)
`adresseEleve2Ligne2` varchar(50)
`adresseEleve2Ligne3` varchar(50)
`adresseEleve2Ligne4` varchar(50)
`codeCommuneEleve2` varchar(5)
`codepostalEleve2` varchar(7)
`division` varchar(8)
`niveau` varchar(1)
`regimeScolaire` varchar(2)
`dateEntree` date
`dateSortie` date
`source` varchar(1)

INDEX:

idEleve, source, etablissement PRIMARY
id (same than t1.id but here can't be null)
etablissement
nom
prenom
nom
dateNaissance
codeCommuneNaissance

谢谢!

mysql performance timeout left-join mysql-5.1
1个回答
0
投票

在复杂的查询中两次使用同一张表时,请为每个实例指定不同的别名。 t1的重复使我感到困惑,并且may会使解析器感到困惑!

如果您希望t1中的行也不在t2中,请使用此模式:

SELECT  ...
    FROM t1
    LEFT JOIN t2  ON t2.foo = t1.foo
    WHERE t2.id IS NULL;   -- Note

避免NOT IN ( SELECT ... );它的优化可能非常差。

[请提供SHOW CREATE TABLE,以便我们了解nom上索引的重复是否是故意的(例如INDEXFULLTEXT)。

不起作用

定时?结果错误?结果太多?结果太少?

© www.soinside.com 2019 - 2024. All rights reserved.