2017-11-19 13 views
1

:인덱스를 만들지 않고 MySQL에서 열 선택 메타 데이터를 검색하는 방법은 무엇입니까? 다음 SQL 쿼리 가정

내가 MySQL이 두 조건이 모두 범위 조건이기 때문에, 같은 테이블 인덱스를 사용하여 두 열에서 찾아 볼 수 없을 것이라고 믿는다
SELECT col1,col2 from table where col1 > 5 and col2 > 8 

. 따라서이 시나리오에서 어떤 열을 색인 할 것인지 알아내는 가장 좋은 방법은 무엇인지 이해하려고 노력하고 있습니다.

실제로 옵션 모두에 대한 색인을 생성하고 카디널리티 정보를 확인하지 않고도 열 A 또는 B가 더 선택적인지 여부를 식별 할 수 있도록 MySQL 메타 데이터에 액세스 할 수 있습니까?

편집 : 명확히하기 위해 목표는 색인없이 실행할 수있는 쿼리의 경우에도이를 수행하는 방법을 찾는 것입니다. 따라서이 경우 행 수가 중요하지 않습니다.

답변

1

이 쿼리를 실행하는 중에 문제가 있습니까?

select count(*), 
     sum(col1 > 5), 
     sum(col2 > 8), 
     sum(col1 > 5 and col2 > 8) 
from t; 

두 번째와 세 번째 열 사이의 값 중 가장 작은 값이 가장 선택됩니다.

참고 : 색인에 두 열을 넣어도 가치가있을 수 있습니다. MySQL은 데이터 페이지에서 데이터를 검색 할 필요없이 where 절에 두 번째 키를 사용할 수 있어야합니다.

+0

필자는 명시 적으로 (질문을 편집 한) 작성하지 않았지만 관련 목표 (*) 쿼리가 인덱스없이 실행 되더라도 정확한 인덱스를 식별 할 수 있어야합니다. 나는 MySQL의 옵티마이 저가 그것을 어떻게하고, 동일한 방법을 모방하는지 알아 내려고 노력하고있다. – Tomer

+0

@Tomer - 나는 수시로 인덱스를 자동으로 생성하는 방법에 대해 숙고 해왔다. 내가 가지고있는 최선의 방법은 [요리 책] (http://mysql.rjweb.org/doc.php/index_cookbook_mysql)입니다. –

2

쿼리의 결과는 col1col2입니다. 즉, INDEX(col1,col2)INDEX(col2,col1)은 "덮음"입니다. "전체 쿼리가 인덱스의 BTREE에서 수행 될 수 있기 때문에 취재가. 당신이 SELECT 목록에 다른 열을 추가 할 경우, 더 이상 커버되지 않습니다

.

을 추가 향상을 제공하지만 문제는 약 이었다 인덱스에 열을 넣으려면 2 차원 배열로 생각하면 col1 > 5 and col2 > 8은 2D 배열의 오른쪽 아래 모서리를 의미합니다 .MySQL은 본질적으로 오른쪽 절반 또는 아래쪽을 스캔해야합니다. 배열의 '절반'입니다. 1 차원 인덱스는 먼저 행이나 열로 정렬되기 때문에

최적화의 새로운 'MRR'기능 의 경우 반쪽이 아닌 모서리에 집중할 수 있습니다. 알아내는 방법은 다음과 같습니다.

add one index 
FLUSH STATUS; 
SELECT ... 
SELECT SESSION STATUS LIKE 'Handler%'; 
drop that index 

이제 다른 색인과 반복하십시오.

그런 다음 처리기 값을 비교하십시오. 가장 큰 숫자는 터치 된 인덱스 (또는 데이터) 행 수를 나타냅니다. 쿼리에서 col1col2 경우

간단한 대답

, 다음 INDEX(col1, col2) (에서 중 순서)를 추가합니다.

더 많은 열이 관련된 경우 INDEX(col1)INDEX(col2)을 추가하십시오. Optimizer는 이들 사이에서 선택합니다.

+0

이 답변을 주셔서 감사합니다. Rick. 나는 실제로 카운트 쿼리를 실행하지 않고 추가 할 인덱스를 결정하는 방법을 찾고 있었고 인덱스를 추가하고 각각에 대해 '무언가를 테스트'하는 방법을 찾고있었습니다. MySQL에 메타 데이터로부터 얻을 수있는 정보가 있으면 결정을 내릴 수 있습니까? 대용량 테이블 및 쿼리의 경우 인덱스 추가 및 제거의 시행 착오를 너무 오래 걸릴 수 있습니다. 특히 많은 쿼리를 최적화하는 경우 더욱 그렇습니다. 나는 그것이 존재한다면, 그것을 피할 수있는 방법을 찾고 있습니다. – Tomer

+1

2 개의 범위는 다루기가 쉽지 않습니다. 내 답변에 "간단한 답변"을 추가했습니다. –