source

선택 쿼리 및 'order by' 절의 MySQL 문제

nicesource 2022. 11. 14. 21:35
반응형

선택 쿼리 및 'order by' 절의 MySQL 문제

에 이상한 문제가 발생하고 있습니다.SELECTMySQL 데이터베이스(InnoDB)에 대해 쿼리합니다.

다음 쿼리는 1개의 일치하는 레코드를 잘못 반환합니다.

select `ID` 
from `AccessTables` 
where `numTableID` = 14 
    AND `numUserCatID` IN (7,253) 
    AND (`numUpdateCat` = 2 OR `numUpdateItems` = 2) 
order by `ID` asc 
limit 1

반면 다음 쿼리는 일치하는 레코드를 올바르게 반환하지 않습니다.

select `ID` 
from `AccessTables` 
where `numTableID` = 14 
    AND `numUserCatID` IN (7,253) 
    AND (`numUpdateCat` = 2 OR `numUpdateItems` = 2) 
limit 1

보시는 바와 같이 이들 쿼리의 유일한 차이점은 'order by' 절입니다.

ID쿼리에서 요청된 열은 테이블의 자동 생성된 기본 키 열입니다.

첫 번째 쿼리에서 반환되는 레코드는 'or' 절 주위에 괄호가 없는 경우 검색되는 레코드입니다.그러나 질의의 그 부분에는 괄호가 둘러져 있기 때문에 왜 이 레코드가 여기에 반환되는지 이해할 수 없습니다.그리고 쿼리에 'order by' 절이 있는 경우에만 해당됩니다.

사용 중인 MySQL 버전은 다음과 같습니다.MySQL Server: 5.5.32-MariaDB-log

여기 누구 이 문제에 대해 좀 밝혀줄 사람 있나요?잘 부탁드립니다.

(EDIT: 괄호를 생략하면 행이 반환되지만 첫 번째 쿼리에서 반환된 행과는 다른 행입니다.)

 insert  into `AccessTables`(`ID`,`numUserCatID`,`numTableID`,`numUpdateCat`,`numPublishCat`,`numUpdateItems`,`dateInsert`,`dateUpdate`,`numInsertAuthorID`,`numUpdateAuthorID`,`numViewItems`) values (71,15,14,0,0,2,'2008-03-13 23:38:47','2013-04-04 09:34:36',0,513,2);

(편집 번호 2: MariaDB는 없지만...http://sqlfiddle.com/ #!2/2a922/8)

nr.3을 편집하여 실제 MariaDB에 대해 다음 쿼리를 실행합니다.

쿼리 1:

EXPLAIN EXTENDED SELECT `ID` 
FROM `AccessTables` 
WHERE `numTableID` = 14 
    AND `numUserCatID` IN (7,253) 
    AND (`numUpdateCat` = 2 OR `numUpdateItems` = 2) 
ORDER BY `ID` ASC 
LIMIT 1;

출력:

"id"    "select_type"   "table" "type"  "possible_keys" "key"   "key_len"   "ref"   "rows"  "filtered"  "Extra"<br />
"1" "SIMPLE"    "AccessTables"  "range" "numUserCatID,numTableID,numUpdateCat,numUpdateItems"   "numTableID"    "8" \N  "136"   "11.03" "Using where"

쿼리 2:

EXPLAIN EXTENDED SELECT `ID` 
FROM `AccessTables` 
WHERE `numTableID` = 14 
    AND `numUserCatID` IN (7,253) 
    AND (`numUpdateCat` = 2 OR `numUpdateItems` = 2) 
LIMIT 1;

출력:

"id"    "select_type"   "table" "type"  "possible_keys" "key"   "key_len"   "ref"   "rows"  "filtered"  "Extra"<br />
"1" "SIMPLE"    "AccessTables"  "range" "numUserCatID,numTableID,numUpdateCat,numUpdateItems"   "numUserCatID"  "8" \N  "20"    "75.00" "Using index condition; Using where"

쿼리 3:

EXPLAIN EXTENDED SELECT `ID` 
FROM `AccessTables` 
WHERE `numTableID` = 14 
    AND (numUserCatID = 7 OR numUserCatID = 253) 
    AND (`numUpdateCat` = 2 OR `numUpdateItems` = 2) 
ORDER BY `ID` ASC 
LIMIT 1;

출력:

"id"    "select_type"   "table" "type"  "possible_keys" "key"   "key_len"   "ref"   "rows"  "filtered"  "Extra"<br />
"1" "SIMPLE"    "AccessTables"  "range" "numUserCatID,numTableID,numUpdateCat,numUpdateItems"   "numTableID"    "8" \N  "136"   "11.03" "Using where"

EDIT nr. 4: 'limit 1'을 삭제하면 'order by'를 삭제하는 것과 같은 결과가 됩니다.행은 찾을 수 없습니다.

질문 4:

EXPLAIN EXTENDED SELECT `ID` 
FROM `AccessTables` 
WHERE `numTableID` = 14 
    AND `numUserCatID` IN (7,253) 
    AND (`numUpdateCat` = 2 OR `numUpdateItems` = 2) 
ORDER BY `ID` ASC;

출력:

"id"    "select_type"   "table" "type"  "possible_keys" "key"   "key_len"   "ref"   "rows"  "filtered"  "Extra"<br />
"1" "SIMPLE"    "AccessTables"  "range" "numUserCatID,numTableID,numUpdateCat,numUpdateItems"   "numUserCatID"  "8" \N  "20"    "75.00" "Using index condition; Using where; Using filesort"

따라서 올바른 결과(0개의 레코드 발견)를 반환하는 쿼리는 numUserCat의 인덱스와 함께 동작하는 것으로 보입니다.ID인 반면 잘못된 결과(1개의 레코드 발견)를 반환하는 쿼리는 numTable의 인덱스와 함께 작동하는 것으로 보입니다.아이디

이상하네...!

편집 nr. 5:
dateInsert(레코드가 테이블에 삽입된 순간을 나타내는 날짜/타임 스탬프)와 같은 다른 열로 순서를 지정하면 쿼리 결과도 변경됩니다.
그런 다음 반환되는 레코드는 없으며 사용되는 인덱스는 numUserCat에 있는 인덱스입니다.또 아이디.

명령어를 사용하고 있었습니다.IDasc'는 ID가 항상 레코드가 DB에 삽입된 순서를 나타낸다고 가정했기 때문입니다.
그러나 이 경우 dateInsert도 기본적으로 동일합니다.

프라이머리 키가 아닌 일반 키 열을 주문에 사용할 경우 대규모 데이터베이스에서 성능 저하가 발생합니까?

정말 이런 일이 일어난다면, 그건 버그야."really"란 데이터베이스 서버에 보내는 쿼리와 동일한 쿼리를 의미합니다.기본 테이블은 그 사이에 갱신되지 않았습니다.

같은 (동일하지 않은) isssue가 여기에 있습니다.MDEV-2662

MariaDB 팀에 문제를 보고해 주세요.


문제를 하려면 예를 합니다.IN , 환;;

AND numUserCatID IN (7,253) 

포함:

AND (numUserCatID = 7 OR numUserCatID = 253)

같은 오류 결과가 나오는지 확인합니다.

MarjaR과 함께 작업한 결과, MariaDB 5.5의 이 버그는 5.5.37로 해결되었습니다.

언급URL : https://stackoverflow.com/questions/23914413/mysql-issue-with-select-query-and-order-by-clause

반응형