한 번에 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 개의 레코드를 가져 오지 않는 것이 "앞"또는 "뒤"에서 같은 시간이 걸릴 수 있습니까? 내가 여기서 뭔가를 놓치고 있니? 미리 감사드립니다.
저는 술을 마셔서 뭔가를 놓쳤을지도 모르지만 실행 시간은 걱정거리가 아니라고 생각합니다. 두 번째 쿼리는 데이터가 변경되지 않는 한 매번 동일한 20 개의 레코드를 반환하는 것처럼 보입니다. –
@DanBracuk 죄송합니다. 완전한 코드가 아닙니다. # start #의 값은 페이지 번호에 따라 증가합니다. 나는 조금 더 설명을 추가 할 것이다. – Jack
모든 페이지에 대해 동일한 성능을 얻지는 않을 것입니다. 정렬되는 중이며 반환 될 첫 번째 줄에 도달해야합니다. 이것은 "시간과 노력을 필요로하지 않습니다"사실은 그 반대가 사실이며, 정렬을 기반으로하는 페이지 매김은 비싸고 시간 소모적입니다. –