복붙노트

[SQL] 테스트에 가장 좋은 방법은 행은 MySQL의 테이블에 존재하는 경우

SQL

테스트에 가장 좋은 방법은 행은 MySQL의 테이블에 존재하는 경우

나는 행이 테이블에 존재하는지 확인하기 위해 노력하고있어. MySQL을 사용,이 같은 쿼리를 수행하는 더 나은입니다 :

SELECT COUNT(*) AS total FROM table1 WHERE ...

및 총 제로가 아닌하거나 같은 쿼리를 수행하는 것이 더 있는지 확인 :

SELECT * FROM table1 WHERE ... LIMIT 1

어떤 행이 반환되었는지 확인?

두 쿼리에서 WHERE 절은 인덱스를 사용합니다.

해결법

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

    1.또한 EXISTS 시도 할 수 있습니다 :

    또한 EXISTS 시도 할 수 있습니다 :

    SELECT EXISTS(SELECT * FROM table1 WHERE ...)
    

    및 설명서에 따라, 당신은 아무것도를 선택할 수 있습니다.

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

    2.나는 최근에이 주제에 대한 몇 가지 연구를 만들었습니다. 이를 구현하는 방법은 필드가 텍스트 필드, 비 고유 필드의 경우 다를 수 있습니다.

    나는 최근에이 주제에 대한 몇 가지 연구를 만들었습니다. 이를 구현하는 방법은 필드가 텍스트 필드, 비 고유 필드의 경우 다를 수 있습니다.

    나는 텍스트 필드와 몇 가지 테스트를 만들었습니다. 우리가 1M 항목이있는 테이블을 가지고 있다는 사실을 고려. 37 개 항목은 '뭔가'동일하다 :

    그러나 이제, BIGINT PK 필드로, 단 하나의 항목이 '321321'과 같다 :

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

    3.ChrisThompson의 대답 @의 간단한 예

    ChrisThompson의 대답 @의 간단한 예

    예:

    mysql> SELECT * FROM table_1;
    +----+--------+
    | id | col1   |
    +----+--------+
    |  1 | foo    |
    |  2 | bar    |
    |  3 | foobar |
    +----+--------+
    3 rows in set (0.00 sec)
    
    mysql> SELECT EXISTS(SELECT 1 FROM table_1 WHERE id = 1);
    +--------------------------------------------+
    | EXISTS(SELECT 1 FROM table_1 WHERE id = 1) |
    +--------------------------------------------+
    |                                          1 |
    +--------------------------------------------+
    1 row in set (0.00 sec)
    
    mysql> SELECT EXISTS(SELECT 1 FROM table_1 WHERE id = 9);
    +--------------------------------------------+
    | EXISTS(SELECT 1 FROM table_1 WHERE id = 9) |
    +--------------------------------------------+
    |                                          0 |
    +--------------------------------------------+
    1 row in set (0.00 sec)
    

    별칭을 사용 :

    mysql> SELECT EXISTS(SELECT 1 FROM table_1 WHERE id = 1) AS mycheck;
    +---------+
    | mycheck |
    +---------+
    |       1 |
    +---------+
    1 row in set (0.00 sec)
    
  4. ==============================

    4.내 연구, 나는 속도를 다음에 얻는 결과를 찾을 수 있습니다.

    내 연구, 나는 속도를 다음에 얻는 결과를 찾을 수 있습니다.

    select * from table where condition=value
    (1 total, Query took 0.0052 sec)
    
    select exists(select * from table where condition=value)
    (1 total, Query took 0.0008 sec)
    
    select count(*) from table where condition=value limit 1) 
    (1 total, Query took 0.0007 sec)
    
    select exists(select * from table where condition=value limit 1)
    (1 total, Query took 0.0006 sec) 
    
  5. ==============================

    5.나는이 코멘트에에 감동되었지만 그것은, 지적 가치가 느낌이이 상황에서 :

    나는이 코멘트에에 감동되었지만 그것은, 지적 가치가 느낌이이 상황에서 :

    SELECT 1 FROM my_table WHERE *indexed_condition* LIMIT 1
    

    우수에인가 :

    SELECT * FROM my_table WHERE *indexed_condition* LIMIT 1
    

    첫 번째 쿼리가 인덱스에 의해 만족 될 수 있기 때문에 (아마도 모든 테이블의 컬럼은 사용 된 인덱스에 있지 않으면) 두 번째 행의 모양을 필요로하는 반면이있다.

    한계 절을 추가하면 엔진이 어떤 행을 찾은 후 중지 할 수 있습니다.

    첫 번째 질의는 비교해야한다 :

    SELECT EXISTS(SELECT * FROM my_table WHERE *indexed_condition*)
    

    어떤 엔진 (1 / * 여기에 차이가 없습니다),하지만 난 여전히 존재 사용할 때 습관을 강화하기 위해 1을 써서 동일한 신호를 보냅니다

    SELECT EXISTS(SELECT 1 FROM my_table WHERE *indexed_condition*)
    

    이 행이 일치하지 않을 때 당신이 명시 적으로 반환을 요구하는 경우 의미가 포장 EXISTS를 추가 할 수 있습니다.

  6. ==============================

    6.카운트가 항상 DB를 사용하기 위해 별도의 부하를 만들기 때문에 당신이 하나를 선택 카운트 사용하지 제안하고 바로 귀하의 기록은 그렇지 않은 경우는 null을 반환하고 당신이 그것을 처리 할 수있는 경우는 1을 반환합니다.

    카운트가 항상 DB를 사용하기 위해 별도의 부하를 만들기 때문에 당신이 하나를 선택 카운트 사용하지 제안하고 바로 귀하의 기록은 그렇지 않은 경우는 null을 반환하고 당신이 그것을 처리 할 수있는 경우는 1을 반환합니다.

  7. ==============================

    7.때때로하지 않는 경우 자동 증분 차 존재하는 경우 행의 키 (ID)와 0을 얻기 위해 매우 편리합니다.

    때때로하지 않는 경우 자동 증분 차 존재하는 경우 행의 키 (ID)와 0을 얻기 위해 매우 편리합니다.

    다음은이가 하나의 쿼리에서 할 수있는 방법은 다음과 같습니다

    SELECT IFNULL(`id`, COUNT(*)) FROM WHERE ...
    
  8. ==============================

    8.아마 눈에 띄게하지만, 지금까지 원하는 결과를 얻는 등, 모두가 충분해야하지만, 카운트 쿼리는 빠릅니다.

    아마 눈에 띄게하지만, 지금까지 원하는 결과를 얻는 등, 모두가 충분해야하지만, 카운트 쿼리는 빠릅니다.

  9. ==============================

    9.비 InnoDB 테이블의 경우 당신은 또한 정보 스키마 테이블을 사용할 수 있습니다 :

    비 InnoDB 테이블의 경우 당신은 또한 정보 스키마 테이블을 사용할 수 있습니다 :

    http://dev.mysql.com/doc/refman/5.1/en/tables-table.html

  10. ==============================

    10.나는 COUNT (1)와 함께 갈 것입니다. 이는 해당 행의 적어도 하나의 열이있는 경우 (*) COUNT (*) 시험을보고 있기 때문에 빠르게 COUNT보다! = NULL. 이미 장소의 조건 (절)가 특히 때문에, 그 필요하지 않습니다. COUNT (1) 대신 항상 유효하며, 시험에 훨씬 적은 시간이 소요 1의 유효성을 테스트합니다.

    나는 COUNT (1)와 함께 갈 것입니다. 이는 해당 행의 적어도 하나의 열이있는 경우 (*) COUNT (*) 시험을보고 있기 때문에 빠르게 COUNT보다! = NULL. 이미 장소의 조건 (절)가 특히 때문에, 그 필요하지 않습니다. COUNT (1) 대신 항상 유효하며, 시험에 훨씬 적은 시간이 소요 1의 유효성을 테스트합니다.

  11. ==============================

    11.또는 당신은 조건에 원시 SQL 부분을 삽입 할 수 있습니다 그래서 나는 가지고있다 ( '회원 AS 구성원 FROM Member.id NOT IN (SELECT Membership.member_id)') '조건'=> 어레이

    또는 당신은 조건에 원시 SQL 부분을 삽입 할 수 있습니다 그래서 나는 가지고있다 ( '회원 AS 구성원 FROM Member.id NOT IN (SELECT Membership.member_id)') '조건'=> 어레이

  12. ==============================

    12.이전 쿼리가 일반적으로 더 빨리 될 가능성이 있으므로 COUNT (*)는, MySQL의에 최적화되어 있습니다.

    이전 쿼리가 일반적으로 더 빨리 될 가능성이 있으므로 COUNT (*)는, MySQL의에 최적화되어 있습니다.

  13. from https://stackoverflow.com/questions/1676551/best-way-to-test-if-a-row-exists-in-a-mysql-table by cc-by-sa and MIT license