2012-03-26 7 views
3

1 백만 개의 레코드가있는 테이블이 있으며 2 쿼리를 디자인했습니다.SQL 쿼리 성능 차이

테이블 인덱스 :

id = primary 
bedroom = index 
elevator = index 
pricemeter = index 
dateadd = index 

내가이 쿼리 이유를 알고 싶어 :

SELECT 
    * 
FROM (
    SELECT 
     * 
    FROM `p_apartmentbuy` 
    WHERE 
     `sqm` > 100 
     AND `bedroom` > 1 
     AND `elevator` = 1 
     AND `pricemeter` < 5999999 
    ORDER BY `id` DESC 
    LIMIT 0, 30 
) AS `alias` 
ORDER BY `id` DESC, `dateadd` DESC 

보다 훨씬 빠른이 하나를 먼저 쿼리가 0.0027 초를했다

SELECT 
    * 
FROM `p_apartmentbuy` 
WHERE 
    `sqm` > 100 
    AND `bedroom` > 1 
    AND `elevator` = 1 
    AND `pricemeter` < 5999999 
ORDER BY `id` DESC, `dateadd` DESC 
LIMIT 0, 30 

및 두 번째 쿼리는 5.6848 초가 걸렸습니다. 결과는 모두 다른 것과 같고 where 절의 변수는 예제입니다.

빠른 쿼리에 대 한 설명 : enter image description here

느린 쿼리에 대 한 설명 : enter image description here

+0

실행 계획에 어떤 내용이 있습니까? – Lamak

+2

'SELECT' 전에'EXPLAIN'을 사용하면 실행 계획을 볼 수 있고 쿼리를 실행하기 전에 SQL 캐시가 비어 있는지 확인할 수 있습니다. –

+0

@ N.B. 나는 결과를 설명해 주었다. – Hamidreza

답변

2

글쎄, 우리는 인덱스에 대한 더 많은 정보가 필요하다. 그러나 그 쿼리를 간단히 살펴보면 그것들이 다르다는 것을 알 수있다. 그들은 서로 다른 결과를 던질 수도 있습니다. 단지 그 우연의 일치가 동일합니다 (데이터가 어떻게 구조화되었는지에 따라 다를 수 있음). 첫 번째 쿼리에서는 30 행을 선택하고 id (인덱스가있을 수 있음) 순서로 정렬 한 다음 dateadd으로 정렬합니다.이 방법은 매우 간단합니다. 두 번째 쿼리는 두 개의 열로 모든 백만 레코드를 정렬 한 다음 30을 선택해야하므로 분명히 비용이 더 많이 듭니다.

+1

첫 번째 쿼리는 또한 * id에 의해 * 모든 백만 레코드 * 정렬해야하며 인덱스는 순서가 아닌 필터링에서 작동해야합니다. 당신이 제안한 것처럼 하나의 것이 아니라 많은 행에 걸쳐 두 개의 열을 정렬하고 있기 때문에 이것을 망칠 수있는 유일한 방법은 내부의'dateadd' 순서 일 것입니다. – vol7ron

0

테이블이 기본 키로 ID를 사용해야합니다. 이 경우, 행은 ID C 럼으로 인덱스되고 모든 데이터는 이미 ID로 정렬됩니다.

그래서 첫 30 행을 취하는 것은 mysql 계획에서 빠릅니다. 그 30 줄을 빨리 주문할거야.

'dateadd'열에 따라 정렬하려면 두 번째 쿼리에서 모든 행을 반환해야합니다. LIMIT 절이 계산됩니다.

이 질문에 대한 답변을 보내주십시오.

+0

ID가 기본 키 였으므로 where 절에있는 모든 필드는 – Hamidreza

2

두 번째 쿼리는 전체 데이터 집합을 iddateadd으로 정렬해야만 제한을 적용 할 수 있습니다.

첫 번째 쿼리는 30 개의 레코드로 초기에 반환되며이 레코드는 iddateadd으로 정렬됩니다. 훨씬 적은 작업.

+0

+1이지만 첫 번째 쿼리는'dateadd '가 아닌'id'로 정렬됩니다. – vol7ron

+0

최종 결과는'dateadd'로 정렬됩니다. 나는 전체 엔티티로서이 두 개의 쿼리에 대해 말하고있다. –

+0

내 편집을 다시 바꿀 수는 있지만 위의 두 번째 쿼리가 위의'id'와'dateadd'에 의해 정렬되고 첫 번째 쿼리가 'id'가 제한되고 나머지 30 개는'id'와'dateadd'를 위해 정렬됩니다. – vol7ron

1

을 확인합니다 설명하지만, 첫 번째는 아마도 기본 키 및 정렬을 필요로하지 않는 ID로 그렇게 주문 인 ID에 의해 처음 30 개 기록을 얻고있다. 그리고 어쩌면, 다음, 아니 위해 모든 레코드를 받고 ID와 날짜별로 정렬 한 다음 DATEADD에 처음 30 ...

색인을 취하고, 단지 두 번째 반면에 그 (30)

정렬 ?

오직 추측 된 것입니다.