MySQL 5.1.73 Тайм-аут левого соединения - PullRequest
1 голос
/ 05 февраля 2020

Я работаю локально с mysql 5.7.28, и все работает, но на моем сервере разработки 5.1.73 истекло время моего запроса (+ 2 мин).

Запрос довольно прост, но Я не понимаю, почему он не работает ...

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

Спасибо!

Ответы [ 2 ]

0 голосов
/ 06 февраля 2020

Хорошо, я решил проблему!

t1.id был в латинице, а t2.id был в utf8 .... Изменено на то же самое, и это мгновенно!

0 голосов
/ 06 февраля 2020

При использовании одной и той же таблицы дважды в сложном запросе присвойте каждому экземпляру свой псевдоним. Повторение 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).

не работает

Тайм-аут? Неправильные результаты? Слишком много результатов? Слишком мало результатов?

Было добавлено много оптимизаций между 5.1 и 5.7; это может объяснить "тайм-аут".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...