[SQL] 테스트에 가장 좋은 방법은 행은 MySQL의 테이블에 존재하는 경우
SQL테스트에 가장 좋은 방법은 행은 MySQL의 테이블에 존재하는 경우
나는 행이 테이블에 존재하는지 확인하기 위해 노력하고있어. MySQL을 사용,이 같은 쿼리를 수행하는 더 나은입니다 :
SELECT COUNT(*) AS total FROM table1 WHERE ...
및 총 제로가 아닌하거나 같은 쿼리를 수행하는 것이 더 있는지 확인 :
SELECT * FROM table1 WHERE ... LIMIT 1
어떤 행이 반환되었는지 확인?
두 쿼리에서 WHERE 절은 인덱스를 사용합니다.
해결법
-
==============================
1.또한 EXISTS 시도 할 수 있습니다 :
또한 EXISTS 시도 할 수 있습니다 :
SELECT EXISTS(SELECT * FROM table1 WHERE ...)
및 설명서에 따라, 당신은 아무것도를 선택할 수 있습니다.
-
==============================
2.나는 최근에이 주제에 대한 몇 가지 연구를 만들었습니다. 이를 구현하는 방법은 필드가 텍스트 필드, 비 고유 필드의 경우 다를 수 있습니다.
나는 최근에이 주제에 대한 몇 가지 연구를 만들었습니다. 이를 구현하는 방법은 필드가 텍스트 필드, 비 고유 필드의 경우 다를 수 있습니다.
나는 텍스트 필드와 몇 가지 테스트를 만들었습니다. 우리가 1M 항목이있는 테이블을 가지고 있다는 사실을 고려. 37 개 항목은 '뭔가'동일하다 :
그러나 이제, BIGINT PK 필드로, 단 하나의 항목이 '321321'과 같다 :
-
==============================
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.내 연구, 나는 속도를 다음에 얻는 결과를 찾을 수 있습니다.
내 연구, 나는 속도를 다음에 얻는 결과를 찾을 수 있습니다.
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.나는이 코멘트에에 감동되었지만 그것은, 지적 가치가 느낌이이 상황에서 :
나는이 코멘트에에 감동되었지만 그것은, 지적 가치가 느낌이이 상황에서 :
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.카운트가 항상 DB를 사용하기 위해 별도의 부하를 만들기 때문에 당신이 하나를 선택 카운트 사용하지 제안하고 바로 귀하의 기록은 그렇지 않은 경우는 null을 반환하고 당신이 그것을 처리 할 수있는 경우는 1을 반환합니다.
카운트가 항상 DB를 사용하기 위해 별도의 부하를 만들기 때문에 당신이 하나를 선택 카운트 사용하지 제안하고 바로 귀하의 기록은 그렇지 않은 경우는 null을 반환하고 당신이 그것을 처리 할 수있는 경우는 1을 반환합니다.
-
==============================
7.때때로하지 않는 경우 자동 증분 차 존재하는 경우 행의 키 (ID)와 0을 얻기 위해 매우 편리합니다.
때때로하지 않는 경우 자동 증분 차 존재하는 경우 행의 키 (ID)와 0을 얻기 위해 매우 편리합니다.
다음은이가 하나의 쿼리에서 할 수있는 방법은 다음과 같습니다
SELECT IFNULL(`id`, COUNT(*)) FROM WHERE ...
-
==============================
8.아마 눈에 띄게하지만, 지금까지 원하는 결과를 얻는 등, 모두가 충분해야하지만, 카운트 쿼리는 빠릅니다.
아마 눈에 띄게하지만, 지금까지 원하는 결과를 얻는 등, 모두가 충분해야하지만, 카운트 쿼리는 빠릅니다.
-
==============================
9.비 InnoDB 테이블의 경우 당신은 또한 정보 스키마 테이블을 사용할 수 있습니다 :
비 InnoDB 테이블의 경우 당신은 또한 정보 스키마 테이블을 사용할 수 있습니다 :
http://dev.mysql.com/doc/refman/5.1/en/tables-table.html
-
==============================
10.나는 COUNT (1)와 함께 갈 것입니다. 이는 해당 행의 적어도 하나의 열이있는 경우 (*) COUNT (*) 시험을보고 있기 때문에 빠르게 COUNT보다! = NULL. 이미 장소의 조건 (절)가 특히 때문에, 그 필요하지 않습니다. COUNT (1) 대신 항상 유효하며, 시험에 훨씬 적은 시간이 소요 1의 유효성을 테스트합니다.
나는 COUNT (1)와 함께 갈 것입니다. 이는 해당 행의 적어도 하나의 열이있는 경우 (*) COUNT (*) 시험을보고 있기 때문에 빠르게 COUNT보다! = NULL. 이미 장소의 조건 (절)가 특히 때문에, 그 필요하지 않습니다. COUNT (1) 대신 항상 유효하며, 시험에 훨씬 적은 시간이 소요 1의 유효성을 테스트합니다.
-
==============================
11.또는 당신은 조건에 원시 SQL 부분을 삽입 할 수 있습니다 그래서 나는 가지고있다 ( '회원 AS 구성원 FROM Member.id NOT IN (SELECT Membership.member_id)') '조건'=> 어레이
또는 당신은 조건에 원시 SQL 부분을 삽입 할 수 있습니다 그래서 나는 가지고있다 ( '회원 AS 구성원 FROM Member.id NOT IN (SELECT Membership.member_id)') '조건'=> 어레이
-
==============================
12.이전 쿼리가 일반적으로 더 빨리 될 가능성이 있으므로 COUNT (*)는, MySQL의에 최적화되어 있습니다.
이전 쿼리가 일반적으로 더 빨리 될 가능성이 있으므로 COUNT (*)는, MySQL의에 최적화되어 있습니다.
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
'SQL' 카테고리의 다른 글
[SQL] WHERE HAVING 대 (0) | 2020.03.12 |
---|---|
[SQL] 오라클 (? 테이블에 갱신 또는 삽입) 방법 UPSERT에 (0) | 2020.03.12 |
[SQL] 차이 사이의 가입 및 INNER는 가입 (0) | 2020.03.12 |
[SQL] 준비된 문을 사용하여 변수 열 이름 (0) | 2020.03.12 |
[SQL] SELECT 또는 INSERT는 경쟁 조건에 발생하기 쉬운 함수에서인가? (0) | 2020.03.12 |