복붙노트

[SQL] MySQL은 "LIMIT 1"을 사용하여 어느 시점이 있습니까 색인 / 고유의 필드에 쿼리 할 때?

SQL

MySQL은 "LIMIT 1"을 사용하여 어느 시점이 있습니까 색인 / 고유의 필드에 쿼리 할 때?

예를 들어, 나는 고유 것이다 필드 I의 노하우에 질의하고 있는데 기본 키와 같은 색인이 생성됩니다. 따라서 나는이 쿼리는 (심지어 LIMIT 1없이) 1 개 행을 반환합니다 알고

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

또는 단 1 개 행을 업데이트

UPDATE TABLENAME의 SET somefield의 = 'someValue와'tablename.id = 123 LIMIT 1

겠습니까 필드가 인덱스되어있는 경우 쿼리 실행 시간을 개선 LIMIT 1을 추가?

해결법

  1. ==============================

    1.기본 키 또는 고유 제한 조건 중 하나를 반대하는 필터 기준을 조회 할 때 그것은 사용 LIMIT 1 좋은 방법이 아닙니다. 기본 키 또는 고유 제한 조건이 수단은 그 값을 가진 테이블의 한 행 / 기록이 단 하나의 행 / 기록은 지금까지 반환됩니다. 그것은 기본 키 / 고유의 필드에 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 가정 나을 그래서 당신은 하나 개의 행을 반환합니다.

  2. ==============================

    2.필드가 그것에 고유 인덱스가있는 경우, 나는 전혀이 개선 실행 시간을 볼 수 없습니다 - 그것은 마이크로 최적화 기준으로도 스트레칭입니다.

    필드가 그것에 고유 인덱스가있는 경우, 나는 전혀이 개선 실행 시간을 볼 수 없습니다 - 그것은 마이크로 최적화 기준으로도 스트레칭입니다.

    그러나, 나는 잠재적으로 다른 문제를 마스킹 볼 수 있습니다. 어떻게 든 당신이있는 거 쿼리가 고유 인덱스를 상실하는시 필드를 이러한 쿼리에 LIMIT 1을 추가하고, 말과 DB는 같은 값으로 여러 행을 가져옵니다. 이 코드는 행복하게 함께 걷 겠죠 유지합니다 - 당신이 알고 (및 수정)이 될 빠르고, 대신 더 큰 근본적인 문제를 실패 할 수 있습니다 생각할 것입니다.

    내 자신의 DB 인터페이스 코드에서, 나는 몇 가지 SQL을 실행하고 더 이상의 행을 다시 얻는 경우에 예외를 throw하는 방법의 queryOneRow ()를 가지고있다. 이 응용 프로그램 계층에서 오히려 수비에 비해 SQL에서 명시 적으로이 문제를 처리하기 위해 나에게 가장 의미가 있습니다.

  3. ==============================

    3.나는 독특한 필드에 쿼리 대부분의 경우 나는 여전히 LIMIT 1. 사용에서 나는 데이터베이스 / 테이블 내 쿼리와 함께 무엇을 누구든지 상관없이 반환하거나 둘 이상의 행을 조작 않을 것을 보장 할 때문에 대부분이 작업을 수행.

    나는 독특한 필드에 쿼리 대부분의 경우 나는 여전히 LIMIT 1. 사용에서 나는 데이터베이스 / 테이블 내 쿼리와 함께 무엇을 누구든지 상관없이 반환하거나 둘 이상의 행을 조작 않을 것을 보장 할 때문에 대부분이 작업을 수행.

    일반적으로이 또한 동적으로 조작 된 전체 데이터베이스를 백업 엉망 쿼리의 경우 포함해야한다 (그리고 아니오 - 나는 SQL 주입에 대해 이야기하고 있지 않다).

  4. ==============================

    4.쿼리가 반환 것이기 때문에, 어떤 주어진 순간에, 하나 개의 기록; 다음 LIMIT 1의 추가는 실행 시간을 증가하지 않습니다.

    쿼리가 반환 것이기 때문에, 어떤 주어진 순간에, 하나 개의 기록; 다음 LIMIT 1의 추가는 실행 시간을 증가하지 않습니다.

    나는 확실히 순서 알고리즘 MySQL의 사용이 LIMIT 1 개 요청을 수행 할 아니에요. 이 경우, LIMIT 1의 추가가 실제로 여러 명령에 의해 실행 시간을 지연시킬 수있다 - 그러나 아이러니, 그것은 단지 한 기록을 반환하는 비교 식 또는 반복자를 사용할 수 있습니다.

  5. ==============================

    5.짧은 답변: 당신이 인덱스 고유의 필드에 대 한 검색하는 경우 : 차이가 없다.

    짧은 답변: 당신이 인덱스 고유의 필드에 대 한 검색하는 경우 : 차이가 없다.

    그러나 것을주의 : 당신이하지 고유의 필드에 대 한 검색하는 경우 : 당신은 쿼리에 LIMIT 1을 추가 도움이됩니다. 경우에도 해당 필드에 인덱스를 가지고있다.

    예를 들어, 당신은 이메일 필드에 고유 인덱스가없는 경우

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

    보다 빠른 것

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

    비록 두 쿼리는 하나 개의 레코드를 반환합니다.

    MySQL은 더 기록을 위해 검색을 중지 있기 때문에 하나 개의 레코드를 발견하면 그것은이다.

  6. from https://stackoverflow.com/questions/3848390/is-there-any-point-using-mysql-limit-1-when-querying-on-indexed-unique-field by cc-by-sa and MIT license