2014-07-21 2 views
0

동일한 쿼리가 저속 로그에 계속해서 기록되는 것을 발견했습니다. 그러나 더 빠르게 만드는 방법을 알지 못합니다. 나는 가능한 대부분의 최적화를했다고 믿는다. 쿼리는 다음과 같습니다.간단한 SQL 쿼리를 더 빨리 만들 수 있습니다.

SELECT merk_id FROM profile_merk WHERE profile_id = '51485e0d9ce6d' 

profile_id는 물론 모든 쿼리에 따라 다릅니다. 표에는 약 40 mln 행과 2 열이 있습니다. 한 열은 merk_id이고 다른 열은 profile_id입니다.

Tbl | Non_unique | Key_name | Seq_in_index | Column_name | Collation| Cardinality | Sub_part  
profile_merk | 0 | PRIMARY | 1 | merk_id | A | 4125 | NULL | NULL |  BTREE  
profile_merk | 0 | PRIMARY | 2 |  profile_id | A |  39101247 | NULL | NULL |  BTREE  
profile_merk | 1 | profile_id | 1 |  profile_id | A| 131212 | NULL | NULL |  BTREE  
profile_merk | 1 | merk_id | 1 |  merk_id | A |  4125 | NULL | NULL |  BTREE 

그리고 쿼리의 설명 문은 다음과 제공 : 나는 다음과 같은 테이블에 인덱스가

id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra  
1 | SIMPLE | profile_merk | ref | profile_id | profile_id | 62 | const | 1688 | Using where 

내가 성능을 최적화하기 위해 더 많은 무엇을 할 수 있는가? 나는 그것이 열려있는 질문의 종류라는 것을 깨닫는다. 그러나 어떤 도움이라도 매우 많이 평가 될 것이다! 이 간단한 쿼리

+1

코드를 읽기 쉽도록 형식을 지정하십시오. 열이 제대로 정렬되지 않은 테이블을 게시했습니다. 당신은 또한 SO의 markdown 편집기의 형식을 엉망으로 만드는 탭을 사용했습니다. 붙여 넣기 만 복사하지 마십시오. 미리보기에서 어떻게 보이는지 확인하십시오. – Krumia

답변

3

:

가장 성능이 복합 키를 사용
SELECT merk_id 
FROM profile_merk 
WHERE profile_id = '51485e0d9ce6d'; 

:

create index idx_profilemark_profileid_merkid on profile_mark(profile_id, merk_id) 

기본 키의 문제점은 두 개의 열이 필요한 순서에없는 것입니다 이 쿼리. profile_mark(profile_id, merk_id)profile_mark(merk_id, profile_id)의 색인 간에는 큰 차이가 있습니다. 본질적으로 인덱스는 왼쪽에서 오른쪽으로 사용되어 where 절이 인덱스 열을 사용할 수있는 첫 번째 기회를 얻습니다.

+0

아마도 62 번이 주어진 데이터에 대한 잔인 함처럼 보이기 때문에 'profile_id' 컬럼 길이를 줄이기 위해 OP를 조언하는 것이 합리적 일 것입니다. – zerkms

+1

반환하는 모든 데이터 (merk_id)가 글쎄, 그래서 테이블에 대한 데이터를 읽을 필요가 없습니다. 하지만 인덱스는 실제로 조인 및 필터링에 사용되지 않기 때문에 인덱스를 악용하는 것처럼 느껴집니다. 다른 필드도 필요하면 곧바로 인덱스에 해당 필드를 추가하지 않는 한 성능이 느려지지만 적절한 솔루션처럼 들리지는 않습니다. 그래서 예, 효과가 있을지는 몰라도 미래의 증거는 아닙니다. – GolezTrol

+0

+1 매우 근사합니다. 하나의 질문입니다, 당신은 이것을 설명하는 MySQL 구현/이론에 대한 링크를 포함시킬 수 있습니까? –

관련 문제