MySQL: IN(p1)은 IN(p1, p2, ...)과 다르게 작동합니까? (MySQL: Does IN(p1) function differently to IN(p1, p2, ... )?)


문제 설명

MySQL: IN(p1)은 IN(p1, p2, ...)과 다르게 작동합니까? (MySQL: Does IN(p1) function differently to IN(p1, p2, ... )?)

I've just noticed this very odd (at least it seems to me), thing... 

I've made sure the queries aren't being cached, but, queries using only one value in the IN() function are super slow... for no reason I can't think of. I could put a dummy value in there but... I'd really rather not :/

SELECT Clues.* FROM Clues INNER JOIN SolutionWords 
ON SolutionWords.SolutionWordID = Clues.SolutionWordID  
WHERE SolutionWord COLLATE utf8_general_ci = 'TEST A' 
AND Clues.CultureID IN (1);

Affected rows: 0 Time: 3.843ms

SELECT Clues.* FROM Clues INNER JOIN SolutionWords 
ON SolutionWords.SolutionWordID = Clues.SolutionWordID  
WHERE SolutionWord COLLATE utf8_general_ci = 'TEST B' 
AND Clues.CultureID IN (1,2);

Affected rows: 0 Time: 0.141ms

SELECT Clues.* FROM Clues INNER JOIN SolutionWords 
ON SolutionWords.SolutionWordID = Clues.SolutionWordID  
WHERE SolutionWord COLLATE utf8_general_ci = 'TEST C' 
AND Clues.CultureID IN (1);

Affected rows: 0 Time: 3.815ms

[SQL] 
SELECT Clues.* FROM Clues INNER JOIN SolutionWords 
ON SolutionWords.SolutionWordID = Clues.SolutionWordID  
WHERE SolutionWord COLLATE utf8_general_ci = 'TEST D' 
AND Clues.CultureID IN (1,2);

Affected rows: 0 Time: 0.142ms

SELECT Clues.* FROM Clues INNER JOIN SolutionWords 
ON SolutionWords.SolutionWordID = Clues.SolutionWordID  
WHERE SolutionWord COLLATE utf8_general_ci = 'TEST E' 
AND Clues.CultureID IN (1);

Affected rows: 0 Time: 3.843ms

SELECT Clues.* FROM Clues INNER JOIN SolutionWords 
ON SolutionWords.SolutionWordID = Clues.SolutionWordID  
WHERE SolutionWord COLLATE utf8_general_ci = 'TEST F' 
AND Clues.CultureID IN (1,2);

Affected rows: 0 Time: 0.142ms

EDIT: Changing parameter order ‑> no effect

**[SQL] SELECT Clues.* FROM Clues INNER JOIN SolutionWords ON SolutionWords.SolutionWordID = Clues.SolutionWordID  WHERE Clues.CultureID IN (1) AND SolutionWord COLLATE utf8_general_ci = 'TEST 1' ;
Affected rows: 0
Time: 3.833ms**

[SQL] 
SELECT Clues.* FROM Clues INNER JOIN SolutionWords ON SolutionWords.SolutionWordID = Clues.SolutionWordID  WHERE SolutionWord COLLATE utf8_general_ci = 'TEST 2' AND Clues.CultureID IN (1,2);
Affected rows: 0
Time: 0.141ms

[SQL] 
SELECT Clues.* FROM Clues INNER JOIN SolutionWords ON SolutionWords.SolutionWordID = Clues.SolutionWordID  WHERE SolutionWord COLLATE utf8_general_ci = 'TEST 3' AND Clues.CultureID IN (1);
Affected rows: 0
Time: 3.821ms

[SQL] 
SELECT Clues.* FROM Clues INNER JOIN SolutionWords ON SolutionWords.SolutionWordID = Clues.SolutionWordID  WHERE SolutionWord COLLATE utf8_general_ci = 'TEST 4' AND Clues.CultureID IN (1,2);
Affected rows: 0
Time: 0.141ms

[SQL] 
SELECT Clues.* FROM Clues INNER JOIN SolutionWords ON SolutionWords.SolutionWordID = Clues.SolutionWordID  WHERE SolutionWord COLLATE utf8_general_ci = 'TEST 5' AND Clues.CultureID IN (1);
Affected rows: 0
Time: 3.848ms

[SQL] 
SELECT Clues.* FROM Clues INNER JOIN SolutionWords ON SolutionWords.SolutionWordID = Clues.SolutionWordID  WHERE SolutionWord COLLATE utf8_general_ci = 'TEST 6' AND Clues.CultureID IN (1,2);
Affected rows: 0
Time: 0.142ms


EDIT: EXPLAIN for slow query (actually, it's EXACTLY the same for the fast one as well unless I'm missing something obvious)

1   SIMPLE  Clues   ref fk_Clues_Cultures1,fk_Clues_SolutionWords1  fk_Clues_Cultures1  5   const   371462  Using where
1   SIMPLE  SolutionWords   eq_ref  PRIMARY PRIMARY 4   ClueExplorer.Clues.SolutionWordID   1   Using where

1   SIMPLE  Clues   ref fk_Clues_Cultures1,fk_Clues_SolutionWords1  fk_Clues_Cultures1  5   const   371462  Using where
1   SIMPLE  SolutionWords   eq_ref  PRIMARY PRIMARY 4   ClueExplorer.Clues.SolutionWordID   1   Using where

EDIT: SHOW CREATE TABLE

CREATE TABLE `Clues` (
  `ClueID` int(11) NOT NULL AUTO_INCREMENT,
  `SolutionWordID` int(11) NOT NULL,
  `Clue` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `SolutionWordBreakup` varchar(45) DEFAULT NULL,
  `SpellingID` int(11) DEFAULT NULL,
  `WordFormID` int(11) DEFAULT NULL,
  `GrammaticalFormID` int(11) DEFAULT NULL,
  `ClueCategoryID` int(11) DEFAULT NULL,
  `ClueFormatID` int(11) DEFAULT NULL,
  `ClueStyleID` int(11) DEFAULT NULL,
  `CultureID` int(11) DEFAULT NULL,
  `Difficulty` int(11) DEFAULT NULL,
  `Interestingness` int(11) DEFAULT NULL,
  `ReviewDate` datetime DEFAULT NULL,
  `Explanation` text,
  `Citation` text,
  `RelevantFrom` datetime DEFAULT NULL,
  `RelevantTo` datetime DEFAULT NULL,
  PRIMARY KEY (`ClueID`),
  KEY `fk_Clues_Spellings` (`SpellingID`),
  KEY `fk_Clues_WordForms1` (`WordFormID`),
  KEY `fk_Clues_GrammaticalForms1` (`GrammaticalFormID`),
  KEY `fk_Clues_ClueFormats1` (`ClueFormatID`),
  KEY `fk_Clues_ClueStyles1` (`ClueStyleID`),
  KEY `fk_Clues_Cultures1` (`CultureID`),
  KEY `fk_Clues_ClueCategories1` (`ClueCategoryID`),
  KEY `fk_Clues_SolutionWords1` (`SolutionWordID`),
  CONSTRAINT `fk_Clues_ClueCategories1` FOREIGN KEY (`ClueCategoryID`) REFERENCES `ClueCategories` (`ClueCategoryID`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `fk_Clues_SolutionWords1` FOREIGN KEY (`SolutionWordID`) REFERENCES `SolutionWords` (`SolutionWordID`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `fk_Clues_ClueFormats1` FOREIGN KEY (`ClueFormatID`) REFERENCES `ClueFormats` (`ClueFormatID`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `fk_Clues_ClueStyles1` FOREIGN KEY (`ClueStyleID`) REFERENCES `ClueStyles` (`ClueStyleID`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `fk_Clues_Cultures1` FOREIGN KEY (`CultureID`) REFERENCES `Cultures` (`CultureID`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `fk_Clues_GrammaticalForms1` FOREIGN KEY (`GrammaticalFormID`) REFERENCES `GrammaticalForms` (`GrammaticalFormID`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `fk_Clues_Spellings` FOREIGN KEY (`SpellingID`) REFERENCES `Spellings` (`SpellingID`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `fk_Clues_WordForms1` FOREIGN KEY (`WordFormID`) REFERENCES `WordForms` (`WordFormID`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=2458300 DEFAULT CHARSET=utf8

참조 솔루션

방법 1:

Matt, have you considered that your problem could be related with the order of the columns in your where clause? Could you please try (as a example):

...WHERE Clues.CultureID IN (1,2) 
     AND SolutionWord COLLATE utf8_general_ci = 'STRING'

And see how it goes. 

Chers,

Renato

(by Matt Searlesmedina)

참조 문서

  1. MySQL: Does IN(p1) function differently to IN(p1, p2, ... )? (CC BY‑SA 3.0/4.0)

#MySQL #query-performance






관련 질문

MySQL: IN(p1)은 IN(p1, p2, ...)과 다르게 작동합니까? (MySQL: Does IN(p1) function differently to IN(p1, p2, ... )?)

SQL 테이블 카운팅 및 조인 (SQL Table Counting and Joining)

ORA-00979: Oracle에 대한 GROUP BY 표현식이 아니지만 절 차이의 컨텍스트에서 MySQL에 대해서는 유효하지 않습니다. (ORA-00979: not a GROUP BY expression for Oracle but not valid for MySQL in context of clause difference)

PHP에서 카테고리 및 하위 카테고리 목록 검색 (Retrieve Category & Subcategory list in PHP)

R과 반짝이는 다층 테이블을 만드는 방법은 무엇입니까? (How to make multiple layered table form with R and shiny?)

mysql에서 저장 프로시저가 더 효율적입니까? (In mysql, are stored procedures more efficient?)

PHP - MySQL 쿼리 문제 (PHP - Mysql query problem)

데이터베이스 값이 이미 존재하는지 확인하는 방법 (how to check if databases values are already exists)

SQL 테이블에서 누락된 날짜를 채우는 방법 (How to fill the missing date in a sql table)

잘린 잘못된 DOUBLE 값을 수정하는 방법: '정의되지 않음' 오류 (How to fix Truncated incorrect DOUBLE value: 'undefined' error)

반복되는 NotSupportedError: 인증 플러그인 'caching_sha2_password'가 지원되지 않습니다. 이전 솔루션을 시도했지만 소용이 없었습니다. (Repeated NotSupportedError: Authentication plugin 'caching_sha2_password' is not supported tried the previous solutions to no avail)

MySQL (버전 8.0 이하) : 날짜 값을 선택하고 마일스톤 날짜 테이블에서 날짜 행을 반환합니다. (MySQL (version lower then 8.0) : Select where date value and return a row of dates from table of milestone date)







코멘트