2017-11-05 1 views
0

한 번에 20 개의 레코드를 검색하기 위해 Myfql과 함께 Coldfusion에서 페이지 매김을 수행하려고합니다. 먼저, 검색 할 레코드의 총 수를 구합니다.MYSQL - 페이지 매김 쿼리 실행 시간 문제

<CFQUERY DATASOURCE="#datasource#" USERNAME="#username#" PASSWORD="#password#" NAME="myQuery" result="tmpResult"> 
    SELECT products.field1, products.field2, products.field3, company.field1, company.field2 
    FROM products JOIN company ON products.field1 = company.field1 
    WHERE products.field2 = <cfqueryparam value = "#myfield#" cfsqltype = "cf_sql_integer" maxLength = "2"> 
    AND MATCH(field2) AGAINST(<cfqueryparam value = "#TRIM(string)#" cfsqltype = "cf_sql_char" maxLength = "52"> IN BOOLEAN MODE) 
    ORDER by products.field3 DESC 
    LIMIT <cfqueryparam value="#start#" cfsqltype="cf_sql_integer">, 20 
</CFQUERY> 

(참고 :. #의 값이 # 각 페이지 (20)에 의해 증가합니다 시작)

모든

<CFQUERY DATASOURCE="#datasource#" USERNAME="#username#" PASSWORD="#password#" NAME="myCount" CACHEDWITHIN="#CreateTimeSpan(0,0,3,0)#"> 
    SELECT COUNT(*) as TotalCount 
    FROM products 
    WHERE products.field1 = <cfqueryparam value = "#myfield#" cfsqltype = "cf_sql_integer" maxLength = "2"> 
    AND MATCH(field2) AGAINST(<cfqueryparam value = "#TRIM(string)#" cfsqltype = "cf_sql_char" maxLength = "52"> IN BOOLEAN MODE) 
</CFQUERY>  

그럼 나는 한 번에 20 개 레코드를 검색하려면 다음을 사용 잘 작동하는 것 같습니다. 첫 번째 페이지를 클릭하면 실행 시간 (#tmpResult.ExecutionTime#)에 20 개의 레코드를 검색하는 데 40 초가 걸렸음을 알 수 있습니다 (밀리 초라고 가정). 그러나 레코드 번호 40,000 일 수있는 마지막 페이지를 클릭하면 마지막 20 개 레코드를 검색하는 데 500 밀리 초가 소요됩니다. 뒤로가는 것은 나중에 페이지가 검색하는 데 더 오랜 시간이 걸린 것처럼 보입니다.

왜 불일치입니까? 같은 양의 20 개의 레코드를 가져 오지 않는 것이 "앞"또는 "뒤"에서 같은 시간이 걸릴 수 있습니까? 내가 여기서 뭔가를 놓치고 있니? 미리 감사드립니다.

+0

저는 술을 마셔서 뭔가를 놓쳤을지도 모르지만 실행 시간은 걱정거리가 아니라고 생각합니다. 두 번째 쿼리는 데이터가 변경되지 않는 한 매번 동일한 20 개의 레코드를 반환하는 것처럼 보입니다. –

+0

@DanBracuk 죄송합니다. 완전한 코드가 아닙니다. # start #의 값은 페이지 번호에 따라 증가합니다. 나는 조금 더 설명을 추가 할 것이다. – Jack

+0

모든 페이지에 대해 동일한 성능을 얻지는 않을 것입니다. 정렬되는 중이며 반환 될 첫 번째 줄에 도달해야합니다. 이것은 "시간과 노력을 필요로하지 않습니다"사실은 그 반대가 사실이며, 정렬을 기반으로하는 페이지 매김은 비싸고 시간 소모적입니다. –

답변

0

먼저 읽고 을 읽으십시오. 그것은 훨씬 더 빨리 만드는 방법을 설명합니다.

초기 COUNT(*)이 느린 경우 UI를 다시 생각해보십시오. 검색 엔진이 더 이상 발견 된 항목 수를 알려주지 않거나 적어도 대략적인 답변 만 제공하는 방법에 유의하십시오. 오래 전에 배운 교훈에서 힌트를 얻으십시오.

"이유"에 대한 질문을 해결하려면 ... LIMIT 100, 20은 120 개의 행을 찾아 100을 건너 뛴 다음 20을 제공해야합니다. 따라서 페이지가 더 느려지고 느려집니다.

하지만 악화됩니다. 쿼리가 너무 복잡하면 모두 일치하는 행을 찾아야하며 모두, 그 중 하나만 ,이면 오프셋 및 제한을 수행해야합니다. 이 경우 많은 수의 행이있는 경우 첫 페이지조차도 속도가 느립니다.