2014-03-06 2 views
0

mysql에서 다음 쿼리에 대해 어떤 종류의 파일 정렬도 사용하지 않는 인덱스를 설정할 수있는 방법이 있습니까?하위 쿼리 및 정렬 최적화

SELECT * FROM bigtable WHERE id IN ([a indexed subquery]) ORDER BY title; 

이 경우 ID가 기본 키입니다. Innodb가 사용되었습니다. 이러한 종류의 쿼리에서 EXPLAIN을 수행하면 항상 filesort를 사용한다고 표시됩니다.

편집 1 : 내 경우에는 자동으로 생성되기 때문에

하위 쿼리는 중요하지 않습니다. 그러나 인수를 위해이 같은 쿼리 대신

SELECT * FROM bigtable WHERE id IN (4,6,8,7,10,40,21,54...) ORDER BY title; 

는 "ORDER BY"에 대한 filesort를 사용하지 않는 인덱스에이 쿼리 어떤 방법이 할 수 있습니다?

보너스 질문 :이 작업을 수행 할 수있는 다른 데이터베이스가 있습니까?

+0

별로만큼 충분히 추측 할 수 있지만 하위 쿼리 보는 것은이 왼쪽 가입과 함께 더 좋을 수도, 그리고 (ID를 기반으로 빅 테이블에 인덱스, 다른 가능한 하위 쿼리 열, 제목)을 사용하여 표지 인덱스로 사용할 수 있습니다. – DRapp

답변

0

많은 연구를하고 있고 이미 인덱스에 대해 많이 알고 있기 때문에 정확한 예를 위해 현재 인덱스 유형에서는 불가능하다는 것을 알았습니다. 나는 실제로 이것을 할 수있는 다른 db를 찾지 못했습니다.

사실 최종 목록은 db에 의해 수동으로 정렬되어야하지만 정렬은 여전히 ​​매우 빠르므로 큰 문제는 아닙니다. 모든 해답을 가져 주셔서 감사합니다!

내가 틀렸다면 수정하시기 바랍니다 ;-)

0

데이터베이스 (또는 동일한 mysql 서버에 호스팅 된 다른 데이터베이스)에 임시 테이블을 만들 수있는 권한이 있습니까?

그래, 나는 다음과 같은 솔루션을 제안하는 경우 : 아니, 다음이를하려고하면

CREATE TEMPORARY TABLE temp_indexed_subquery 
SELECT id 
FROM bigtable 
WHERE "where conditions"; 
SELECT b.* FROM bigtable AS b 
JOIN temp_indexed_subquery AS t 
ON t.id = b.id; 

가 :

SELECT b.* 
FROM bigtable 
JOIN (SELECT id FROM bigtable WHERE "where conditions") t ON t.id = b.id; 

그것의 단단한 테이블 구조 또는 하위 쿼리를 모른 채 더 많은 도움을 .

편집 : 아, filesort와 비슷한 문제가 있고, 그 주위에 다음과 같은 방법으로 (처음 제안 된 솔루션을 수정) 가지고 : 여기

CREATE TEMPORARY TABLE temp_indexed_subquery 
(UNIQUE KEY id(id), KEY title(title)) 
SELECT id, title 
FROM bigtable 
WHERE "where conditions"; 
SELECT b.*, t.title FROM temp_indexed_subquery AS t 
JOIN bigtable AS b 
ON b.id = t.id 
ORDER BY t.title; 

내가 임시 테이블의에 인덱스를 추가 해요 "를 제목 "입력란에 입력하고 정렬합니다. 필자의 경우, 이렇게하면 MySQL은 filesort를 사용하여 정렬 된 결과를 제공 할 필요가 없었다. 이게 도움이 되길 바란다. (그런데 bigtable에는 몇 행이 있고, 색인화 된 하위 쿼리에는 일반적으로 몇 개의 ID가 있습니까)

+0

문제는 하위 쿼리가 아닙니다. 하위 쿼리는 매번 다르며 자동으로 생성됩니다. 그러나 하위 쿼리가 ID 목록 인 경우에도 예제를 사용할 수 있습니다. 문제는 목록을 정렬해야한다는 것입니다. – doep

0

경우에 따라 MySQL은 정렬을 위해 색인을 사용합니다. 당신이 bigtable(title)에 인덱스를 가지고 있다면, 다음 쿼리는 인덱스 사용해야은 "인덱스 하위 쿼리는"발생하지 않는 한 나는 당신의 쿼리는 인덱스를 사용하는 기대

select * 
from bigtable 
order by title; 

을, 옵티마이 저는 다른 실행을 us.ea하기 계획. MySQL은 꽤 좋은 직장입니다 documentingorder by에 대한 최적화 전략

1

여기에 filesort 작업을 수행하는 것이 정말 나쁜가요? 예를 들어 내가 얻은 것. here FILEsort라고 불릴 수도 있지만, 본질적으로 그것은 단지 일반적인 정렬 일뿐입니다. ORDER BY에 명시 적으로 요청하십시오.

나는 시스템이 다음 반환하기 전에 결과 종류를 볼 수있는 기록의 제목 값을 추출, id - 오더에 저장된 정의에 의해 있는 관련 기록을 찾기 위해 id 필드에 인덱스를 사용하고 있으리라 믿고있어 클라이언트에게.

나는 이것을 피하기위한 좋은 방법을 생각해 낼 수 없으며, 왜 그렇게 나쁜지도 모른다. 정말로 정말로 원한다면 어떻게 든 PK를 TITLE + ID 필드로 변경 한 다음 쿼리가 전체 테이블을 스캔하여 오른쪽 ID을 올바른 순서로 찾도록 할 수 있습니다. 하지만 이것은 매우 비효율적 일 뿐이며 은 단일 스레드로으로 작업 할 수 있습니다. 일단 그것이 여러 스레드에서 나왔다면 결과를 누적하고 결과를 정렬하여 결과를 확신해야합니다. 순진한 '시작부터 끝까지 접근하는 방식'을 '망칠'수있는 최적화가있을 가능성을 감안할 때, 최선의 시나리오에서도 시스템이 안전한 방법으로 그리고 어쨌든 정렬 될 경우 너무 놀라지 않을 것입니다 .

+0

그래, 나는 filesort가 나쁜 이름이라는 데 동의한다. EXPLAIN이 나에게 말하는 것을 반영하고있었습니다. – doep

+0

나는 정렬을하지 않고도 내 예제와 같은 간단한 쿼리를 완전히 인덱싱 할 수있는 방법이 없다는 점이 조금 이상하다. 어떻게 다른 인덱스가 작동하는지에 대해 생각하지만 좋은 해결책을 찾을 수 없습니다 :) – doep