1

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

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

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

谢谢 !

4

2 回答 2

0

好的,我解决了问题!

t1.id 是拉丁文,t2.id 是 utf8 .... 两者都更改为相同的,它是即时的!

于 2020-02-06T10:05:21.017 回答
0

在复杂查询中两次使用同一个表时,为每个实例指定一个不同的别名。的重复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是一种故意(例如INDEXFULLTEXT)。

它不工作

超时?错误的结果?结果太多?结果太少?

5.1和5.7之间增加了很多优化;这可以解释“超时”。

于 2020-02-06T01:00:05.223 回答