2011-01-05 6 views
1

최근 보스 맨의 사무실로 끌려 가서 내 쿼리 중 하나가 시스템 속도를 늦추고 있다고 말했습니다. 나는 그 때 내 WHERE 절이 1 = 1으로 시작 되었기 때문에 그것이라고 들었다. 필자의 스크립트에서는 검색 용어 각각을 쿼리에 추가 했으므로 각 검색 용어 앞에 AND을 붙일 수 있도록 1 = 1을 추가했습니다. 결과를 좁히기 전에 쿼리가 전체 테이블 스캔을 수행하게된다고 들었습니다.WHERE 절 검색 시간을 테스트하는 MySQL 쿼리

나는 이것을 시험하기로 결정했다. 약 14,000 개의 레코드가있는 user 테이블이 있습니다. 쿼리는 phpmyadmin과 PuTTY를 사용하여 각각 5 회 실행되었습니다. phpmyadmin에서는 쿼리를 500 개로 제한했지만 PuTTY에서는 제한이 없습니다. 몇 가지 기본 쿼리를 시도하고 그들에 시간을 계시했다. 1 = 1WHERE 절이없는 쿼리보다 쿼리가 빠르다고 생각했습니다. 이것은 라이브 데이터베이스에 있지만 결과가 상당히 일정한 것으로 보입니다.

나는 여기에 게시하여 누군가가 나를 위해 결과를 무너 뜨릴 수 있는지, 아니면 내게이 논리를 내게 설명 할 수 있는지 확인하기를 바랬다. alt text

+0

결과가 더 빠르면 문제가되지 않습니다. 데이터를 느리게 분석 했습니까? 시간을 지키기 위해 무엇을 사용 했습니까? – VoodooChild

+0

나는 사람들이 WHERE 절에서 1 = 1을 사용하는 것에 대해 어떻게 생각하는지 보게된다.네가 맞아. 내 결과에서 더 빨라 보이는 것 같아. 그게 날 행복하게 해줄거야.하지만 나는 정당화를 원할거야. 어느 프로그램에서든 쿼리가 실행 된 후 "Query x seconds seconds"라고 표시됩니다. 나는 그것이 충분할 것이라고 생각했다. –

답변

2

글쎄, 당신의 상사 - 남자와 그의 정보 소스는 모두 바보입니다. 쿼리에 1=1을 추가해도 전체 테이블이 검색되지 않습니다. 그것이하는 유일한 일은 쿼리 파싱을 아주 오래 걸리는 것입니다. 괜찮은 쿼리 계획 생성기 (mysql을 포함한)는이 조건이 NOP임을 깨닫게 될 것입니다.

나는 내 자신의 데이터베이스 (태양 광 패널의 역사적 데이터)에서 이것을 시도했지만, 소음에서 흥미로운 것은 아무것도 없었다.

mysql> select sum(KWHTODAY) from Samples where Timestamp >= '2010-01-01'; 
seconds: 5.73, 5.54, 5.65, 5.95, 5.49 
mysql> select sum(KWHTODAY) from Samples where Timestamp >= '2010-01-01' and 1=1; 
seconds: 6.01, 5.74, 5.83, 5.51, 5.83 

참고 ajreal의 쿼리 캐시를 사용하지 않도록 설정했습니다.

+0

'네 보스 맨과 그의 정보원은 모두 바보 야. '- lol'd – VoodooChild

+0

사랑해. 그것을 시도해 주셔서 감사 드리며 저에게 축복을 주 시옵소서. –

1

두 테스트 중 처음으로 set session query_cache_type=off; 했습니까?

둘째, PHPmyadmin 및 퍼티 (mysql 클라이언트)에 대한 테스트 쿼리가 너무 다르기 때문에 확인하는 방법은 무엇입니까?
두 사이트 모두 동일한 쿼리를 적용해야합니다.

또한 PHPmyadmin은 쿼리 캐시가 해제되어 있다고 가정 할 수 없습니다. phpmyadmin의 시간 표시에는 PHP 처리가 포함되어 있으므로 피해야합니다.

따라서 mysql 클라이언트에 대한 테스트를 대신 수행해야합니다.

+0

재미 있습니다. 'WHERE 1 = 1'쿼리가 절이없는 쿼리보다 오래 걸리는 것처럼 보였지만 "WHERE 1 = 1 AND'firstName' = 'David'"과 "WHERE'firstName '= 'David' ". –

+0

둘 다 다르다고 생각하지 않습니다. 주요 용의자는 쿼리 캐시를 끄지 않았습니다. – ajreal

1

이것은 MySQL 내부에서 일어나는 일을 결정하는 정확한 방법이 아닙니다. 캐싱 및 네트워크 변형과 같은 경우 결과가 왜곡 될 수 있습니다.

"설명"을 사용하여 MySQL이 1 = 1의 유무에 관계없이 쿼리에 어떤 쿼리 계획을 사용하는지 확인해야합니다. DBA는 이러한 결과에 더 많은 관심을 가질 것입니다. 또한, 1 = 1이 전체 테이블 스캔을 유발할 경우 확실하게 알 수 있습니다.

(가) 구문을 설명은 여기에 있습니다 : http://dev.mysql.com/doc/refman/5.0/en/explain.html 해석하는 방법

결과 현재 위치 : http://dev.mysql.com/doc/refman/5.0/en/explain-output.html

+0

그 점은 매우 좋습니다. 나는 무슨 일이 일어나고 있는지보기 위해 설명을 사용하는 것을 살펴볼 것입니다. 나는 아직도 누군가가 그들의 경험에 비추어 나를 위해 어떤 것을 밝힐 수 있기를 바라고있다. –

+0

나는 그 쿼리에 대해 EXPLAIN을 시도했다. 이들 모두는 "추가"열을 제외하고 동일한 결과를가집니다. WHERE 절이 있으면 "Where using"이라고 표시됩니다. 흥미로운 점은 "EXPLAIN SELECT * FROM'user' WHERE 1 = 1"을하면 WHERE 절이없는 것처럼 "Extra"열이 비어있는 것입니다. –