문제

하나를 갖는 것 사이에는 상당한 성능 차이가 있습니까? SELECT foo, bar, FROM users 500 행, 500 행을 반환하는 쿼리 SELECT foo, bar, FROM users WHERE id = x 한 번에 쿼리가 나오나요?

내가 쓰고있는 PHP 응용 프로그램에서, 나는 약 500 개의 선택 진술을 생성하는 명확하고 읽기 쉬운 코드 섹션 중에서 선택하려고합니다. 또는 500 행을 반환하는 하나의 선택 만 사용하는 모호하고 복잡한 방식으로 IT를 작성합니다.

명확하고 유지 관리 가능한 코드를 사용하는 방식을 선호하지만 각 선택에 대한 연결 오버 헤드가 성능 문제를 일으킬 수 있습니다.

배경 정보, 관련이있는 경우 : 1) PHP에서 코딩 된 드 루팔 모듈입니다. 의문

감사!

도움이 되었습니까?

해결책

하나의 큰 배치를 선택하고 응용 프로그램 코드에서 결과를 한 행에 대해 대량의 선택을 수행하는 것보다 결과를 구문 분석하는 것이 거의 항상 더 빠릅니다. 그래도 둘 다 구현하고 프로파일 링하는 것이 좋습니다. 항상 가정의 수를 최소화하기 위해 노력하십시오.

다른 팁

특히 모든 쿼리 간의 연결을 닫지 않는 경우 MySQL 쿼리의 연결 오버 헤드에 대해 걱정하지 않습니다. 쿼리가 임시 테이블을 만들면 쿼리의 오버 헤드보다 쿼리에서 더 많은 시간을 보냈습니다.

개인적으로 복잡한 SQL 쿼리를 좋아하지만 테이블의 크기, MySQL 쿼리 캐시 및 범위 검사를 수행 해야하는 쿼리의 성능 (색인에 대해조차도)이 모두 차이를 만듭니다.

나는 이것을 제안한다 :

1) 간단하고 올바른 기준을 설정하십시오. 나는 이것이 Zillion-query 접근법이라고 생각합니다. 이것은 틀리지 않았으며, 아마도 외울 가능성이 높습니다. 몇 번 실행하고 쿼리 캐시 및 응용 프로그램 성능을보십시오. 특히 다른 코드 관리자와 함께 작업하는 경우 앱을 유지 관리 가능하게 유지하는 기능이 매우 중요합니다. 또한 실제로 큰 테이블을 쿼리하는 경우 작은 쿼리는 확장 성을 유지합니다.

2) 복잡한 쿼리를 코딩합니다. 결과를 정확성에 비교 한 다음 시간을 비교하십시오. 그런 다음 쿼리에서 기대치를 사용하여 스캔 한 행이 무엇인지 확인하십시오. 나는 종종 가입이 있거나 x! = y 또는 임시 테이블을 생성하는 조건이있는 경우, 특히 항상 업데이트되는 테이블에있는 경우 쿼리 성능이 꽤 나빠질 수 있음을 발견했습니다. 그러나 복잡한 쿼리가 올바르지 않을 수도 있고 응용 프로그램이 커짐에 따라 복잡한 쿼리가 더 쉽게 깨질 수 있음을 발견했습니다. 복잡한 쿼리는 일반적으로 더 큰 행 세트를 스캔하여 종종 임시 테이블을 생성하고 호출합니다. using where 스캔. 테이블이 클수록 더 비싸다. 또한 복잡한 쿼리가 팀의 강점에 맞지 않는 팀 고려 사항이있을 수 있습니다.

3) 결과를 팀과 공유하십시오.

복잡한 쿼리는 MySQL 쿼리 캐시에 도달 할 가능성이 적으며 충분히 큰 경우 캐시하지 마십시오. (자주 쿼리를 위해 MySQL 쿼리 캐시를 저장하려고합니다.) 또한 인덱스를 스캔 해야하는 사전 상사도 수행되지 않는 쿼리. (x! = y, x> y, x <y). 쿼리와 같은 쿼리 SELECT foo, bar FROM users WHERE foo != 'g' and mumble < '360' 스캔을 끝내십시오. (이 경우 쿼리 오버 헤드 비용은 무시할 수 있습니다.)

작은 쿼리는 선택하고 예측하는 필드가 색인화되는 한 인덱스에서 모든 값을 얻는 것만으로 임시 테이블을 만들지 않고 종종 완료 될 수 있습니다. 그래서 쿼리 성능 SELECT foo, bar FROM users WHERE id = x 정말 훌륭합니다 (esp는 열이 있습니다 foo 그리고 bar 일명처럼 색인됩니다 alter table users add index ix_a ( foo, bar );.)

응용 프로그램의 성능을 높이는 다른 좋은 방법은 응용 프로그램의 작은 쿼리 결과 (적절한 경우) 또는 구체화 된보기 쿼리의 배치 작업을 수행하는 것입니다. 또한 Xcache에서 발견 된 Memcached 또는 일부 기능을 고려하십시오.

500이 무엇인지 아는 것 같습니다 id 값은 다음과 같은 일을하지 않겠습니까?

// Assuming you have already validated that this array contains only integers
// so there is not risk of SQl injection

$ids = join(',' $arrayOfIds);

$sql = "SELECT `foo`, `bar` FROM `users` WHERE `id` IN ($ids)";
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top