2009-05-28 2 views
4

나는 약을 가지고있다. 테이블의 200K 행, 약 5 분마다 약. 10 개의 새로운 인서트.빈번한 삽입 비율로 MySQL 쿼리의 성능을 향상시키는 방법은 무엇입니까?

나는 행을 가져 오기 위해 다음 쿼리를 사용하고 있습니다 - 정렬 방식으로 모든 행을 페치 이상 10 초를 복용

SELECT tb_post.ID, tb_post.USER_ID, tb_post.TEXT, tb_post.RATING, tb_post.CREATED_AT, 
     tb_user.ID, tb_user.NAME 
FROM tb_post, tb_user 
WHERE tb_post.USER_ID=tb_user.ID 
ORDER BY tb_post.RATING DESC 
LIMIT 30 

.

id select_type  table  type possible_keys key    key_len  ref   rows  Extra 
1 SIMPLE   tb_user  ALL  PRIMARY   NULL   NULL  NULL  20950  Using temporary; Using filesort 
1 SIMPLE   tb_post  ref  tb_post_FI_1 tb_post_FI_1 4   tb_user.id 4

거의 입력 :

는 다음 쿼리 EXPLAIN의 보고서입니다

  • tb_post.RATING이다 플로트 식

사람이 저를 제안 할 수 tb_post.USER_ID 인덱스가 이 방법을 최적화해야하는 몇 가지 지침 질의하고 읽기 성능을 향상시킬 수 있습니까?

추신 : 저는 데이터베이스 스케일링 문제에서 초보자입니다. 따라서 어떤 종류의 제안이라도이 쿼리에만 유용 할 것입니다.

+1

에 의해 SELECT ... ORDER를 EXPLAIN? –

+0

혼란을 드려 죄송합니다. 내 질문을 수정했다. 색인을 생성하려고하는데 USER_ID가 이미 색인 생성되었지만 여전히 도움이되지 않습니다. 질문은 - 다른 컬럼도 인덱스 할 것인가? 그렇다면 어떤 컬럼을 인덱스 할 것인가? – Aditya

+0

Maybee 당신은 JOIN 작업을 사용하고 테이블에 가입하는 순서를 조심해야합니다. 하지만 당신이 사용하는 데이터베이스에 따라 다릅니다 .. 자세한 내용은 http://stackoverflow.com/questions/173726/when-and-why-are-database-joins-expensive/173744#173744 –

답변

1

ORDER BY를 끄면 어떻게됩니까? 성능에 영향을 줍니까? 그게 큰 효과가 있다면 tb_post.RATING에 대한 색인을 고려해보십시오.

+0

ORDER BY 절을 벗어날 수 없습니다. . 나는 그것의 대중적인 등급에 근거하여 결과를 보여줄 필요가있다. – Aditya

+0

@Aditya - tb_post.rating에 색인을 추가하려고 시도 했습니까? – warren

3

당신은 인덱스 tb_post.RATING에 시도 할 수 : MySQL은 ORDER BY 절을 최적화하기 위해 인덱스를 사용 때로는 수 있습니다 http://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html

서로 다른 테이블에서 데이터를 집계하려는 경우를, 당신은 또한의 유형을 확인할 수 있습니다 가입 (http://en.wikipedia.org/wiki/Join_(SQL))하십시오. 어떤 것은 당신이 원하는 것에 따라 다른 것보다 낫습니다.

+0

"Sory for URLs, 나는 하이퍼 링크를 게시 할 수 없습니다 ..."- 그건 고칠 수 있습니다 :-) – VolkerK

+0

tb_post.RATING은 Float 유형입니다. 그래서 인덱스는 Float 타입 컬럼에서 잘 작동합니까? 또한 사용자가 해당 게시물에 투표하면 RATING이 자주 변경됩니다. 매번 누군가 투표를 할 때마다 MySQL은 색인을 다시 작성해야합니다. 투표율이 매우 높으면 매번 건물 지수가 비쌀 수 있습니다. 맞습니까? RATING에 색인을 추가하려고 시도했지만 처음에는 10 초 이상 걸리지 만 다음 번에는 새 투표가 없으면 1-2 초가 걸립니다. 그러나 누군가 투표를하면 바로 같은 페이지를 가져 오는 데 많은 시간이 걸립니다. 자문을 구하십시오. – Aditya

+1

어떻게 색인을 만들고 더 중요한 것은 등급을 업데이트합니까? 난 그냥 200k 행 테스트 테이블 (이드, 평가, 텍스트, user_id)와 함께 : 색인 생성에 상관없이 3 초 걸립니다 (특히, VolkerK의 방법을 사용하여). 등급을 변경하기 위해 단일 행을 업데이트하는 데는 수 밀리 초가 소요됩니다. 업데이트 할 때마다 인덱스를 만들지는 않으므로 정상적인 UPDATE 쿼리를 실행하고 MySQL이 인덱스를 업데이트하도록합니다. 업데이트 (CREATE INDEX가 아니라 UPDATE)를 제대로 수행했다면 캐싱 시스템이 아닌 MySQL이 범인인지 확인하십시오. –

4

ORDER BY 및 WHERE 절을 모두 포함하는 tb_post에 대한 인덱스가 필요합니다. 당신이 색인을하지 않으려는 이유의

CREATE INDEX idx2 on tb_post (rating,user_id)

= > 출력은 tb_post.RATING DESC의 LIMIT 30

"id";"select_type";"table";"type";"possible_keys";"key";"key_len";"ref";"rows";"Extra" 
"1";"SIMPLE";"tb_post";"index";NULL;"idx2";"10";NULL;"352";"" 
"1";"SIMPLE";"tb_user";"eq_ref";"PRIMARY";"PRIMARY";"4";"test.tb_post.USER_ID";"1";""
관련 문제