테이블에 행이 있는지 확인하려고합니다. MySQL을 사용하면 다음과 같은 쿼리를 수행하는 것이 좋습니다.
SELECT COUNT(*) AS total FROM table1 WHERE ...
합계가 0이 아닌지 또는 다음과 같은 쿼리를 수행하는 것이 더 나은지 확인하십시오.
SELECT * FROM table1 WHERE ... LIMIT 1
행이 반환되었는지 확인하십시오.
두 쿼리에서 WHERE 절은 인덱스를 사용합니다.
답변
당신은 또한 시도 할 수 있습니다 EXISTS
:
SELECT EXISTS(SELECT * FROM table1 WHERE ...)
그리고 설명서에 따라 SELECT
무엇이든 할 수 있습니다 .
일반적으로 EXISTS 하위 쿼리는 SELECT *로 시작하지만 SELECT 5 또는 SELECT column1 또는 다른 것으로 시작할 수 있습니다. MySQL은 이러한 하위 쿼리에서 SELECT 목록을 무시하므로 아무런 차이가 없습니다.
답변
나는 최근에이 주제에 관한 연구를했다. 필드가 고유하지 않은 필드 인 TEXT 필드 인 경우이를 구현하는 방법이 달라야합니다.
TEXT 필드로 몇 가지 테스트를 수행했습니다. 1M 항목이있는 테이블이 있다는 사실을 고려하십시오. 37 개의 항목은 ‘something’과 같습니다.
SELECT * FROM test WHERE texte LIKE '%something%' LIMIT 1
로
mysql_num_rows()
: 0.039061069488525s. (빠른)SELECT count(*) as count FROM test WHERE text LIKE '%something%
: 16.028197050095s.SELECT EXISTS(SELECT 1 FROM test WHERE text LIKE '%something%')
: 0.87045907974243s.SELECT EXISTS(SELECT 1 FROM test WHERE text LIKE '%something%'
: 0.044898986816406s.
LIMIT 1)
그러나 이제 BIGINT PK 필드에서 하나의 항목 만 ‘321321’과 같습니다.
SELECT * FROM test2 WHERE id ='321321' LIMIT 1
로
mysql_num_rows()
: 0.0089840888977051s.SELECT count(*) as count FROM test2 WHERE id ='321321'
: 0.00033879280090332s.SELECT EXISTS(SELECT 1 FROM test2 WHERE id ='321321')
: 0.00023889541625977s.SELECT EXISTS(SELECT 1 FROM test2 WHERE id ='321321' LIMIT 1)
: 0.00020313262939453s. (빠른)
답변
@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)
답변
내 연구에서 결과가 다음 속도로 나오는 것을 알 수 있습니다.
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)
답변
의견에서 언급되었지만이 상황에서는 다음과 같이 지적 할 가치가 있다고 생각합니다.
SELECT 1 FROM my_table WHERE *indexed_condition* LIMIT 1
다음보다 우수합니다.
SELECT * FROM my_table WHERE *indexed_condition* LIMIT 1
이는 첫 번째 쿼리가 인덱스에 의해 충족 될 수있는 반면, 두 번째 쿼리는 행 조회가 필요하기 때문입니다 (모든 테이블 열이 사용 된 인덱스에 있지 않는 한).
LIMIT
절을 추가하면 행을 찾은 후 엔진이 중지 될 수 있습니다.
첫 번째 쿼리는 다음과 비슷해야합니다.
SELECT EXISTS(SELECT * FROM my_table WHERE *indexed_condition*)
엔진에 동일한 신호를 보내지 만 (1 / *는 여기에 아무런 차이가 없습니다), 나는 여전히 사용할 때 습관을 강화하기 위해 1을 씁니다 EXISTS
.
SELECT EXISTS(SELECT 1 FROM my_table WHERE *indexed_condition*)
EXISTS
일치하는 행이 없을 때 명시적인 리턴이 필요한 경우 랩핑 을 추가하는 것이 좋습니다.
답변
Count
count는 항상 db 사용을 위해 추가로드를 작성 SELECT 1
하고 레코드가 널 (null)을 리턴하고 처리 할 수 있으면 1 을 리턴 하므로 사용하지 말 것을 제안 하십시오.