2011-02-09 8 views
0
)

내 사이트의 데이터 페이지 속도를 높이려고합니다. 나는 다음과 같은 쿼리를 사용하고 싶습니다,하지만 내가 설명 할 때 그것이 이상 40,000 행을 검색 할 필요가 말한다 :효율적인 페이지 매김 (

SELECT `Item`.`id`, `User`.`id` 
FROM `items` AS `Item` 
LEFT JOIN `users` AS `User` 
    ON (`Item`.`submitter_id` = `User`.`id`) 
WHERE `Item`.`made_popular` < "2010-02-08 22:05:05" 
    AND `Item`.`removed` != 1 
ORDER BY `Item`.`made_popular` DESC 
LIMIT 26 

그러나 나는 "made_popular"에 대한 하한을 추가하는 경우에만 필요 필드를 99 행 (두 날짜 사이의 항목 수)을 스캔하십시오.

SELECT `Item`.`id`, `User`.`id` 
FROM `items` AS `Item` 
LEFT JOIN `users` AS `User` 
    ON (`Item`.`submitter_id` = `User`.`id`) 
WHERE `Item`.`made_popular` < "2010-02-08 22:05:05" 
    AND `Item`.`made_popular` > "2010-02-07 22:05:05" 
    AND `Item`.`removed` != 1 
ORDER BY `Item`.`made_popular` DESC 
LIMIT 26 

두 쿼리는 "made_popular"열에 대한 색인을 사용합니다. "제거 된"항목이 없다고 가정 할 때 두 경우 모두 26 행만 스캔하면 안됩니까? 솔루션은 두 번째 쿼리를 사용하여 26 개 항목을 줄 수있는 낮은 경계를 추가 할 수 있다고 생각합니다. 그러나 그런 해결 방법을 수행해야한다는 것이 이상하게 보입니다.

+0

LIMIT N, M은 반환 할 결과의 오프셋 (N) 및 개수를 설정할 수 있습니다. LIMIT 1,26이 실적을 개선합니까? –

답변

2
but when I do an EXPLAIN it says it needs to scan over 40,000 rows: 

rows의 의미를 오해하는 경우가 종종 있습니다. 결과는 LIMIT 절에 관계없이 결과를 반환하는 데 사용할 수있는 행의 대략적인 양을 의미합니다.

이 경우 걱정하지 않아도됩니다. mysql은 LIMIT에 도달하면 바로 데이터를 가져 오지 않습니다.

+0

그래,이 두 가지 쿼리가 정확히 동일해야합니까? limit 절을 고려하여 검사해야하는 행의 수를 확인할 수있는 방법이 있습니까? – makeee

+0

@makeee : 예. 그리고 복합 색인'removed + made_popular'가 있는지 확인하십시오. – zerkms

+0

@makeee : "한계 조항을 고려하여 검사해야하는 행의 수를 찾는 방법이 있습니까?"- 테이블의 엔진 유형은 무엇입니까? innodb이면 디스크에서 실제로 가져온 레코드의 수를 표시 할 수있는 저수준 도구가 있습니다. – zerkms