programing

인덱스/고유 필드에서 쿼리할 때 MySQL "LIMIT 1"을 사용하는 포인트가 있습니까?

mailnote 2023. 7. 25. 21:13
반응형

인덱스/고유 필드에서 쿼리할 때 MySQL "LIMIT 1"을 사용하는 포인트가 있습니까?

예를 들어, 기본 키와 같이 고유하고 색인화된 필드를 쿼리합니다.따라서 이 쿼리는 하나의 행만 반환합니다(제한 1이 없어도).

SELECT * FROM tablename WHERE tablename.id=123 LIMIT 1

또는 하나의 행만 업데이트합니다.

UPDATE tablename SET somefield='somevalue' WHERE tablename.id=123 LIMIT 1

추가하시겠습니까?LIMIT 1필드가 색인화된 경우 쿼리 실행 시간을 단축하시겠습니까?

기본 키/고유 필드를 쿼리할 때 MySQL "LIMIT 1"을 사용하는 포인트가 있습니까?

사용하는 것은 좋은 방법이 아닙니다.LIMIT 1기본 키 또는 고유 제약 조건에 대해 필터 기준을 사용하여 쿼리하는 경우.기본 키 또는 고유 제약 조건은 테이블에 해당 값을 가진 하나의 행/레코드만 있고 하나의 행/레코드만 반환됨을 의미합니다.가 있다는 것은 모순입니다.LIMIT 1기본 키/키보드 필드에서 나중에 코드를 유지 관리하지 않으면 중요성을 잘못 알고 코드를 다시 추측할 수 있습니다.

그러나 궁극적인 지표는 설명 계획입니다.

explain SELECT t.name FROM USERS t WHERE t.userid = 4

...선택:

id  | select_type | table   | type  | possible_keys  | key      | key_len  |  ref  |  rows  |  Extra
-----------------------------------------------------------------------------------------------------
1   | SIMPLE      | users   | const | PRIMARY        | PRIMARY  | 4        | const | 1      |

...그리고:

explain SELECT t.name FROM USERS t WHERE t.userid = 4 LIMIT 1

...선택:

id  | select_type | table   | type  | possible_keys  | key      | key_len  |  ref  |  rows  |  Extra
-----------------------------------------------------------------------------------------------------
1   | SIMPLE      | users   | const | PRIMARY        | PRIMARY  | 4        | const | 1      |

결론

차이가 없습니다. 필요 없습니다.이 경우 최적화된 것으로 나타납니다(기본 키에 대해서만 검색).

인덱스된 필드는 어떻습니까?

인덱스된 필드는 필터링되는 값의 고유성을 보장하지 않습니다. 둘 이상의 발생이 있을 수 있습니다.LIMIT 1하나의 행을 반환하고 싶다고 가정하면 말이 됩니다.

필드에 고유한 인덱스가 있으면 실행 시간이 향상되는 것을 전혀 볼 수 없습니다. 마이크로 최적화 표준으로도 확장된 것입니다.

하지만 다른 문제들을 잠재적으로 덮어버리는 것을 볼 수 있습니다.이러한 쿼리에 LIMIT 1을 추가하면 쿼리하는 필드의 고유 인덱스가 손실되고 DB는 동일한 값을 가진 여러 행을 얻습니다.이 코드는 계속 행복하게 진행될 것입니다. 저는 당신이 대신 빠르게 실패하고 더 큰 근본적인 문제를 인식하고 수정하기를 원할 것이라고 생각합니다.

나만의 DB 인터페이스 코드에서 일부 SQL을 실행하고 둘 이상의 행을 반환하는 경우 예외를 던지는 메서드 쿼리OneRow()가 있습니다.SQL에서 방어적으로 처리하는 것이 아니라 애플리케이션 계층에서 이 문제를 명시적으로 처리하는 것이 가장 합리적입니다.

고유 필드를 쿼리하는 대부분의 경우 여전히LIMIT 1데이터베이스/테이블에서 수행하는 작업에 관계없이 쿼리가 두 개 이상의 행을 반환하거나 조작하지 않도록 하기 위해 주로 이 작업을 수행합니다.

일반적으로 전체 데이터베이스를 엉망으로 만들기 위해 동적으로 형식이 잘못된 쿼리의 경우에도 적용됩니다(아니오, SQL 주입에 대해 말하는 것이 아닙니다).

쿼리는 주어진 순간에 하나의 레코드만 반환하므로 다음을 추가합니다.LIMIT 1실행 시간이 늘어나지 않습니다.

MySQL이 수행하기 위해 어떤 알고리즘을 사용하는지 잘 모르겠습니다.LIMIT 1요청한다.그러나 아이러니컬하게도 하나의 레코드만 반환하기 위해 비교 표현식이나 반복기를 사용할 수 있습니다. 이 경우 다음을 추가할 수 있습니다.LIMIT 1실제로 실행 시간이 여러 명령에 의해 지연될 수 있습니다.

단답:인덱스된 고유 필드에 대해 검색하는 경우: 차이가 없습니다.

, 다음 사항에 유의하십시오.고유한 필드가 아닌 필드를 검색하는 경우: 다음을 추가하면 유용합니다.LIMIT 1조회할 수 있습니다.당신이 그 분야에 색인을 가지고 있습니다.

예를 들어 고유 인덱스가 없는 경우email들판

SELECT * FROM users WHERE email="user@example.com" LIMIT 1

보다 빠릅니다.

SELECT * FROM users WHERE email="user@example.com"

두 쿼리 모두 하나의 레코드를 반환합니다.

MySQL은 레코드 하나를 찾으면 더 이상의 레코드 검색을 중지하기 때문입니다.

언급URL : https://stackoverflow.com/questions/3848390/is-there-any-point-using-mysql-limit-1-when-querying-on-indexed-unique-field

반응형