MySQL 테이블에 행이 있는지 테스트하는 가장 좋은 방법
테이블에 행이 있는지 알아보려고 합니다.MySQL을 사용하여 다음과 같은 쿼리를 수행하는 것이 더 좋습니까?
SELECT COUNT(*) AS total FROM table1 WHERE ...
합계가 0이 아닌지 또는 다음과 같은 쿼리를 실행하는 것이 좋은지 확인합니다.
SELECT * FROM table1 WHERE ... LIMIT 1
행이 반환되었는지 확인합니다.
두 쿼리 모두 WHERE 절은 인덱스를 사용합니다.
당신도 시도해 볼 수 있다.EXISTS
:
SELECT EXISTS(SELECT * FROM table1 WHERE ...)
매뉴얼에 따르면SELECT
아무거나.
일반적으로 EXISTES 하위 쿼리는 SELECT *로 시작하지만 SELECT 5 또는 SELECT column1 또는 기타로 시작할 수 있습니다.MySQL은 이러한 하위 쿼리의 SELECT 목록을 무시하므로 차이가 없습니다.
나는 최근에 이 주제에 대해 몇 가지 연구를 했다.필드가 고유하지 않은 필드인 TEXT 필드일 경우 구현 방법이 달라야 합니다.
TEXT 필드로 몇 가지 테스트를 했습니다.1M 엔트리가 있는 테이블이 있는 것을 고려하면.37개의 엔트리는 'something'과 같습니다.
SELECT * FROM test WHERE text 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%' LIMIT 1)
: 0.0448986816406s
그러나 현재 BIGINT PK 필드를 사용하면 '321321'과 동일한 엔트리는 1개뿐입니다.
SELECT * FROM test2 WHERE id ='321321' LIMIT 1
와 함께mysql_num_rows()
: 0.008984088977051sSELECT 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
clause를 사용하면 임의의 행을 찾은 후 엔진이 정지할 수 있습니다.
첫 번째 쿼리는 다음과 같아야 합니다.
SELECT EXISTS(SELECT * FROM my_table WHERE *indexed_condition*)
같은 신호를 엔진으로 보내지만(여기서는 1/*는 차이가 없습니다), 그래도 사용 습관을 강화하기 위해 1을 씁니다.EXISTS
:
SELECT EXISTS(SELECT 1 FROM my_table WHERE *indexed_condition*)
를 추가하는 것이 타당할 수 있습니다.EXISTS
일치하는 행이 없을 때 명시적인 반환이 필요한 경우 래핑합니다.
사용하지 말 것을 권장합니다.Count
카운트는 항상 DB를 사용하기 위해 추가 로드를 만들기 때문입니다.SELECT 1
레코드가 바로 거기 있으면 1을 반환하고 그렇지 않으면 null을 반환하며 처리할 수 있습니다.
COUNT 쿼리는 눈에 띄게 빠르지는 않지만 원하는 결과를 얻기 위해서는 둘 다 충분합니다.
증가 프라이머리키(「 key」(「Auto increment primary key」)를 할 수 .id
) 및 ('')0
렇렇면면면면면면
단일 쿼리에서 이를 수행할 수 있는 방법은 다음과 같습니다.
SELECT IFNULL(`id`, COUNT(*)) FROM WHERE ...
InnoDB 이외의 테이블의 경우 정보 스키마 테이블을 사용할 수도 있습니다.
http://dev.mysql.com/doc/refman/5.1/en/tables-table.html
나는 같이 갈 것이다COUNT(1)
.하다, 을 하다COUNT(*)
COUNT(*)
의 적어도1개의 =를 테스트합니다.이미 되어 있기 (「」의 「1」의 「1」의 「=」).특수 절차특히 이미 조건이 설정되어 있기 때문에 이 컬럼은 필요 없습니다.WHERE
(신호)COUNT(1)
1
이는 항상 유효하며 테스트에 걸리는 시간이 훨씬 짧습니다.
또는 조건에 raw sql 파트를 삽입하여 'conditions'=> array Member.id NOT IN (SELECT Memberships.member_id FROM AS Membership)을 설정할 수도 있습니다.)
COUNT(*)
는 MySQL에 최적화되어 있기 때문에 일반적으로 이전 쿼리가 더 빠를 수 있습니다.
언급URL : https://stackoverflow.com/questions/1676551/best-way-to-test-if-a-row-exists-in-a-mysql-table
'programing' 카테고리의 다른 글
Java 부울 getters "is" vs "are" (0) | 2022.10.20 |
---|---|
"테이블 메타데이터 잠금 대기" 상태의 원인이 되고 있는 트랜잭션을 확인하려면 어떻게 해야 합니까? (0) | 2022.10.11 |
Python 객체가 "서브스크립트 가능"인지 아닌지는 무엇을 의미합니까? (0) | 2022.10.11 |
표 크기 - MariaDB Columnstore 대 InnoDB (0) | 2022.10.11 |
JavaScript에서 바이트 단위의 크기를 KB, MB, GB로 변환하는 올바른 방법 (0) | 2022.10.11 |