2016-10-20 1 views
0

이 mysql 쿼리를 최적화하고 싶습니다. 그것은 실행에 5.6 초 걸리는 내 경우에는 저녁이 느립니다. 나는 프로파일 러를 사용하여 문제를 해결했지만 데이터베이스에 대한 지식은별로 없다. 내 질문은 여기에 있습니다 :mysql slow 쿼리는 어떻게 조정합니까?

SELECT 
         n.name, 
         n.computedmeaning, 
         m.origin,        
         m.gender, 
         m.pronunciation, 
         m.similar, 
         m.variants 
         FROM 
         names n 
         INNER JOIN meta m ON m.nameid = n.id 
         WHERE m.religion = 'hindu' 
         AND n.computedmeaning IS NOT NULL ORDER BY n.name LIMIT 0 , 30 

난 단지도 전체 텍스트 검색이 이름 테이블에 사용할 수 name 테이블에 meta 테이블에 PARIMARY INDEX "id"PRIMARY INDEX "id" 있습니다.

enter image description here

+0

쿼리가 잘 보인다는 .. 단지 "말"과'MATCH ... AGAINST ...'구문 조건 –

+0

는'FULLTEXT' 유용 곳의 필드에 대한 인덱스를 제공 참조하십시오. –

답변

0

필드 religioncomputedmeaning에 대한 인덱스 보내기 여기 마침내 enter image description here

내 프로파일 스크린 샷 경고입니다 : 여기 스크린 샷입니다.

은 CREATE INDEX 문이 테이블에 인덱스를 만드는 데 사용됩니다 In MySQL how to set index to the table?

를 참조하십시오.

인덱스를 사용하면 데이터베이스 응용 프로그램에서 데이터를 빠르게 찾을 수 있습니다. 전체 테이블을 읽지 않고.

+0

실행 시간을 확인하십시오 .. –

0

색인을 사용하면 확실하게 쿼리 실행 시간이 단축됩니다.

그러나 아래 검색어를 사용해 볼 수 있습니다. 그것은 당신에게 더 나은 성능을 줄 것입니다.

SELECT 
     n.name, 
     n.computedmeaning, 
     m.origin,        
     m.gender, 
     m.pronunciation, 
     m.similar, 
     m.variants 
    FROM 
     (SELECT * 
      FROM names 
     WHERE computedmeaning IS NOT NULL) n 
INNER JOIN (SELECT * 
       FROM meta 
       WHERE religion='hindu') m ON m.nameid = n.id 
ORDER BY n.name LIMIT 0 , 30 

names 인덱스 수도하여 정렬을 절약 ORDER BY를 소비
0
names: INDEX(name, computedmeaning, id) -- in this order 
meta: INDEX(name_id, religion)  -- in either order 

있다. 또한 "커버링"기능을 통해 성능을 향상시킵니다.

해당 JOIN에 대해 meta 색인이 효율적이어야합니다.

Cookbook on indexing

+0

'SELECT' 앞에'EXPLAIN'을 사용하여 쿼리의 "explain plan"을 생성하십시오. 이 기능은 쿼리를 성능을 조정하는 데 사용하는 첫 번째 도구입니다. 그러나 위의 릭 제임스 (Rick James)가 제안한 지수가 많은 도움이 될 것이라고 생각합니다. 여러분의 이해를 돕기 위해 아마도 Explain Plan을 실행 한 다음, Index를 추가하고 비교를 위해 또 다른 Explain Plan을 실행하십시오. –

관련 문제