我正在使用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
谢谢!
在复杂的查询中两次使用同一张表时,请为每个实例指定不同的别名。 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
上索引的重复是否是故意的(例如INDEX
和FULLTEXT
)。
不起作用
定时?结果错误?结果太多?结果太少?