MySQL 5.1.73 LEFT JOIN超时
MySQL 5.1.73 LEFT JOIN time out
我在本地使用 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 不能(但在 localhost 中也是如此??)。
如果您对这不起作用的原因有任何想法,请随时帮助我 :D
表格:
T1 :
CREATE TABLE `t1` (
`idDossier` bigint(10) NOT NULL AUTO_INCREMENT,
`id` char(11) DEFAULT NULL,
`idEleve` varchar(11) CHARACTER SET latin1 DEFAULT NULL,
`source` varchar(1) CHARACTER SET latin1 NOT NULL,
`departementNaissance` varchar(3) CHARACTER SET latin1 DEFAULT NULL,
`codeCommuneNaissance` varchar(5) CHARACTER SET latin1 DEFAULT NULL,
`uairne` varchar(8) CHARACTER SET latin1 NOT NULL,
`sexe` int(10) NOT NULL,
`nom` varchar(50) CHARACTER SET latin1 NOT NULL,
`prenom` varchar(50) CHARACTER SET latin1 NOT NULL,
`prenom2` varchar(25) CHARACTER SET latin1 DEFAULT NULL,
`prenom3` varchar(25) CHARACTER SET latin1 DEFAULT NULL,
`dateNaissance` date DEFAULT NULL,
`division` varchar(8) CHARACTER SET latin1 DEFAULT NULL,
`niveau` varchar(11) CHARACTER SET latin1 DEFAULT NULL,
`regimeScolaire` varchar(2) CHARACTER SET latin1 DEFAULT NULL,
`dateEntree` date DEFAULT NULL,
`dateSortie` date DEFAULT NULL,
`exam` int(3) DEFAULT NULL,
`autorisation` smallint(1) NOT NULL DEFAULT '0',
`dateAutorisation` date DEFAULT NULL,
PRIMARY KEY (`idDossier`),
KEY `exam` (`exam`),
KEY `nom` (`nom`),
KEY `prenom` (`prenom`),
KEY `dateNaissance` (`dateNaissance`),
KEY `codeCommuneNaissance` (`codeCommuneNaissance`),
KEY `nom_2` (`nom`,`prenom`,`dateNaissance`,`codeCommuneNaissance`),
KEY `autorisation` (`autorisation`),
KEY `ine` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=116431 DEFAULT CHARSET=utf8
////////////////////
T2 :
CREATE TABLE `t2` (
`idEleve` int(19) NOT NULL,
`id` varchar(11) DEFAULT NULL,
`etablissement` varchar(8) NOT NULL,
`sexe` int(10) DEFAULT NULL,
`nom` varchar(50) NOT NULL,
`prenom` varchar(50) NOT NULL,
`prenom2` varchar(100) DEFAULT NULL,
`prenom3` varchar(100) DEFAULT NULL,
`dateNaissance` date DEFAULT NULL,
`codeCommuneNaissance` varchar(5) DEFAULT NULL,
`departementNaissance` varchar(3) DEFAULT NULL,
`adresseEleveLigne1` varchar(50) DEFAULT NULL,
`adresseEleveLigne2` varchar(50) DEFAULT NULL,
`adresseEleveLigne3` varchar(50) DEFAULT NULL,
`adresseEleveLigne4` varchar(50) DEFAULT NULL,
`codeCommuneEleve` varchar(5) DEFAULT NULL,
`codePostalEleve` varchar(7) DEFAULT NULL,
`adresseEleve2Ligne1` varchar(50) DEFAULT NULL,
`adresseEleve2Ligne2` varchar(50) DEFAULT NULL,
`adresseEleve2Ligne3` varchar(50) DEFAULT NULL,
`adresseEleve2Ligne4` varchar(50) DEFAULT NULL,
`codeCommuneEleve2` varchar(5) DEFAULT NULL,
`codepostalEleve2` varchar(5) DEFAULT NULL,
`division` varchar(20) DEFAULT NULL,
`niveau` varchar(11) DEFAULT NULL,
`regimeScolaire` varchar(2) DEFAULT NULL,
`dateEntree` date DEFAULT NULL,
`dateSortie` date DEFAULT NULL,
`source` varchar(1) NOT NULL,
PRIMARY KEY (`idEleve`,`source`,`etablissement`),
KEY `nom` (`nom`),
KEY `prenom` (`prenom`),
KEY `codeCommuneNaissance` (`codeCommuneNaissance`),
KEY `dateNaissance` (`dateNaissance`),
KEY `niveau` (`niveau`),
KEY `etablissement` (`etablissement`),
KEY `nom_2` (`nom`,`prenom`,`dateNaissance`,`codeCommuneNaissance`),
KEY `nom_3` (`nom`,`prenom`),
KEY `eleve_ine` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
谢谢!
在复杂查询中两次使用相同的 table 时,请为每个实例指定不同的别名。 t1
的重复使我感到困惑, 可能 使解析器感到困惑!
如果您想要 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
)。
it's not working
超时?结果错误?结果太多?结果太少?
5.1和5.7之间增加了很多优化;这可以解释"timing out"。
好的我解决了问题!
t1.id 是拉丁语,t2.id 是 utf8 ....
两者都更改为相同的并且是即时的!
我在本地使用 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 不能(但在 localhost 中也是如此??)。
如果您对这不起作用的原因有任何想法,请随时帮助我 :D
表格:
T1 :
CREATE TABLE `t1` (
`idDossier` bigint(10) NOT NULL AUTO_INCREMENT,
`id` char(11) DEFAULT NULL,
`idEleve` varchar(11) CHARACTER SET latin1 DEFAULT NULL,
`source` varchar(1) CHARACTER SET latin1 NOT NULL,
`departementNaissance` varchar(3) CHARACTER SET latin1 DEFAULT NULL,
`codeCommuneNaissance` varchar(5) CHARACTER SET latin1 DEFAULT NULL,
`uairne` varchar(8) CHARACTER SET latin1 NOT NULL,
`sexe` int(10) NOT NULL,
`nom` varchar(50) CHARACTER SET latin1 NOT NULL,
`prenom` varchar(50) CHARACTER SET latin1 NOT NULL,
`prenom2` varchar(25) CHARACTER SET latin1 DEFAULT NULL,
`prenom3` varchar(25) CHARACTER SET latin1 DEFAULT NULL,
`dateNaissance` date DEFAULT NULL,
`division` varchar(8) CHARACTER SET latin1 DEFAULT NULL,
`niveau` varchar(11) CHARACTER SET latin1 DEFAULT NULL,
`regimeScolaire` varchar(2) CHARACTER SET latin1 DEFAULT NULL,
`dateEntree` date DEFAULT NULL,
`dateSortie` date DEFAULT NULL,
`exam` int(3) DEFAULT NULL,
`autorisation` smallint(1) NOT NULL DEFAULT '0',
`dateAutorisation` date DEFAULT NULL,
PRIMARY KEY (`idDossier`),
KEY `exam` (`exam`),
KEY `nom` (`nom`),
KEY `prenom` (`prenom`),
KEY `dateNaissance` (`dateNaissance`),
KEY `codeCommuneNaissance` (`codeCommuneNaissance`),
KEY `nom_2` (`nom`,`prenom`,`dateNaissance`,`codeCommuneNaissance`),
KEY `autorisation` (`autorisation`),
KEY `ine` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=116431 DEFAULT CHARSET=utf8
////////////////////
T2 :
CREATE TABLE `t2` (
`idEleve` int(19) NOT NULL,
`id` varchar(11) DEFAULT NULL,
`etablissement` varchar(8) NOT NULL,
`sexe` int(10) DEFAULT NULL,
`nom` varchar(50) NOT NULL,
`prenom` varchar(50) NOT NULL,
`prenom2` varchar(100) DEFAULT NULL,
`prenom3` varchar(100) DEFAULT NULL,
`dateNaissance` date DEFAULT NULL,
`codeCommuneNaissance` varchar(5) DEFAULT NULL,
`departementNaissance` varchar(3) DEFAULT NULL,
`adresseEleveLigne1` varchar(50) DEFAULT NULL,
`adresseEleveLigne2` varchar(50) DEFAULT NULL,
`adresseEleveLigne3` varchar(50) DEFAULT NULL,
`adresseEleveLigne4` varchar(50) DEFAULT NULL,
`codeCommuneEleve` varchar(5) DEFAULT NULL,
`codePostalEleve` varchar(7) DEFAULT NULL,
`adresseEleve2Ligne1` varchar(50) DEFAULT NULL,
`adresseEleve2Ligne2` varchar(50) DEFAULT NULL,
`adresseEleve2Ligne3` varchar(50) DEFAULT NULL,
`adresseEleve2Ligne4` varchar(50) DEFAULT NULL,
`codeCommuneEleve2` varchar(5) DEFAULT NULL,
`codepostalEleve2` varchar(5) DEFAULT NULL,
`division` varchar(20) DEFAULT NULL,
`niveau` varchar(11) DEFAULT NULL,
`regimeScolaire` varchar(2) DEFAULT NULL,
`dateEntree` date DEFAULT NULL,
`dateSortie` date DEFAULT NULL,
`source` varchar(1) NOT NULL,
PRIMARY KEY (`idEleve`,`source`,`etablissement`),
KEY `nom` (`nom`),
KEY `prenom` (`prenom`),
KEY `codeCommuneNaissance` (`codeCommuneNaissance`),
KEY `dateNaissance` (`dateNaissance`),
KEY `niveau` (`niveau`),
KEY `etablissement` (`etablissement`),
KEY `nom_2` (`nom`,`prenom`,`dateNaissance`,`codeCommuneNaissance`),
KEY `nom_3` (`nom`,`prenom`),
KEY `eleve_ine` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
谢谢!
在复杂查询中两次使用相同的 table 时,请为每个实例指定不同的别名。 t1
的重复使我感到困惑, 可能 使解析器感到困惑!
如果您想要 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
)。
it's not working
超时?结果错误?结果太多?结果太少?
5.1和5.7之间增加了很多优化;这可以解释"timing out"。
好的我解决了问题!
t1.id 是拉丁语,t2.id 是 utf8 .... 两者都更改为相同的并且是即时的!