2009-07-07 5 views
0

이 기사를 통해 나를 도울 수 있기를 바랍니다. 트위터 서비스 (http://foller.me)가 공개 베타 2로 업데이트 될 예정이지만 적어도 2 ~ 3 초 내에 페이지를 제공 할 수있을 때까지이 작업을 수행하고 싶지 않습니다. 현재 버전은 충분히 간단하지만 내가 개발중인 개발 버전은 상당히 복잡합니다.MySQL 최적화 및 미세 조정 팁 찾기

둘 다 2 백만 행을 포함하는 내 관계 및 프로필 테이블에 관한 것입니다. 프로필 테이블에는 일반 트위터 사용자 정보가 포함되어 있으며 관계 테이블에는 UNIQUE 인덱스에 모두 [twitter_id, followed_by] 개의 항목이 있습니다. 가끔씩 실행되는 cron 작업이 있으며 Twitter API에 사용자 추종자를 묻고 데이터를 관계 데이터베이스에 삽입합니다.

InnoDB를 사용하고있어 테이블이 잠겨 있지 않지만 자주 업데이트되므로 쿼리 캐시가 특히 cron 작업이 실행될 때 충분한 히트를 얻지 못합니다.

SELECT screen_name FROM profiles WHERE twitter_id IN (SELECT followed_by FROM relations WHERE twitter_id = 'kovshenin')과 같은 문구가 있습니다. 나는 그것을 할 아주 좋은 방법이 아니라고 확신한다. 그리고 이것들을 켜면 mysql-slow 로그에 올라온 것들이 (플러스 다른 많은 것들이다).

어쨌든, 내 프로젝트를 위해 훌륭한 런타임을 수행하는 방법에 대한 일반적인 팁이 필요합니다.

고마워요.

SELECT p.screen_name 
FROM relations r 
JOIN profiles p 
ON  p.twitter_id = r.followed_by 
WHERE r.twitter_id = 'kovshenin' 

당신은 할 수있다 :

SELECT screen_name 
FROM profiles p 
WHERE EXISTS 
     (
     SELECT 1 
     FROM relations r 
     WHERE r.twitter_id = 'kovshenin' 
       AND r.followed_by = p.twitter_id 
     ) 

을 또한 당신이 UNIQUE 인덱스가 있기 때문에, 당신은 대부분의 아마 JOIN로 쿼리를 다시 작성 도움이됩니다, 다음과 같이

+0

TagCloud를 확장하는 동안 발견 한 몇 가지 문제점과 솔루션을 알려 드리겠습니다. com에 직접 연락하고 싶습니다. 연락처 정보는 http://blog.gahooa.com/about을 참조하십시오. – gahooa

+0

제이슨, 이메일을 떨어 뜨 렸습니다. 감사 – kovshenin

답변

3

봅니다 쿼리를 다시 작성합니다 여분의 DML 오버 헤드를 희생하면서 빈번하게 사용되는 열을 사용하여 여러 개의 인덱스를 작성하는 것도 이점이 있습니다. 예를 들어

이 쿼리 : 당신이 profiles (twitter_id, screen_name)에 복합 인덱스를 만들 경우

SELECT p.screen_name 
FROM relations r 
JOIN profiles p 
ON  p.twitter_id = r.followed_by 
WHERE r.twitter_id = 'kovshenin' 

도, profiles에 보이지 않는 것입니다.

screen_name 선택하면 (만 screen_name를, 내가. 전자. 그것은 항상 SELECT 목록에있는 유일한 열입니다) 응용 프로그램에 충분한 일반적인 쿼리, 당신은 같은 인덱스를 생성 고려해야합니다. 또한

1

EXPLAIN SELECT * FROM PROFILES 

이렇게하면 쿼리를 늦추고 있는지 (인덱스가, 아니 조인하지 등)를 표시합니다 명령 줄에서 Explain을 사용하여 슬로우 쿼리 로그에 쿼리를 확인하고 느린 디버깅 할 수 있도록해야합니다 사람. this answer에서 MySQL 프로파일 러에 대한 정보를 확인하여 테이블 잠금, 쿼리 캐시 검사/쓰기 등에 대한 심도있는 타이밍을 얻을 수 있습니다.