2010-02-19 3 views
7

요즘 MySQL에서 특정 쿼리를 사용하고 있습니다. 500,000 개 이상의 레코드가있는 테이블이 있습니다. |MySQL 정렬 결과가 오래 걸림

을 : tableOrder DESC의 LIMIT 여기에 1

BY items FROM

SELECT * (itemlist_id = 115626)을 주문 설명한다 : 여기에 쿼리 실행되고있다 1 | 단순 | 항목 | 전체 | NULL | NULL | NULL | NULL | 587113 | 사용 장소; filesort 사용 | |

: 여기

그리고

는 process_list 항목입니다 252996 | 루트 | localhost | itemdb | 쿼리 | 0 | 정렬 결과 | SELECT * FROM items WHERE (itemlist_id = 115642) ORDER BY tableOrder DESC LIMIT 1 |

이 쿼리로 인해 처리하는 데 10 분이 걸릴 수 있습니다. 수동으로 실행하면 빠르게 완료됩니다. (세트 1 행 (0.86 초))

감사

당신은 조금 질의 items (itemList_id, TableOrder)에 인덱스를 생성하고 다시 작성해야
+1

천천히 정렬하고 레코드를 찾을 수 없습니까? 인덱스되지 않은 필드에 500k + 레코드의 테이블 스캔이있는 경우 시간이 오래 걸릴 수 있습니다. 그리고 "수동"의 신속성은 MySQL (또는 OS)가 이전 시도의 데이터에 캐시되어 훨씬 빠르게 실행되기 때문일 수 있습니다. –

답변

6

:

SELECT * 
FROM items 
WHERE itemlist_id = 115626 
ORDER BY 
     itemlist_id DESC, tableOrder DESC 
LIMIT 1 

ORDER BY의 첫 번째 조건이 될 것처럼 보일 수 있습니다을 중복되지만, MySQL은 올바른 계획 (정렬되지 않음)을 선택하는 데 도움이됩니다.

+0

고마워! 인덱스와 쿼리를 추가했는데 이제는 빠르게 타격을 입고 있습니다. –

+0

당신은 쿼리에 대한 편집을위한 리소스를 제공해 주시겠습니까? 왜 저를 위해 이해하는 것이 아주 중요합니다. – TDSii

+1

@TDSii : 나는'MySQL' 문서와 나의 경험을 바탕으로 편집을했다. – Quassnoi

관련 문제