2009-10-20 3 views
2

나는 MySQL의 질문이있다MySQL 질문 : 칼럼의 색인!

(각 게시물이 작성자에 의해 작성되고 작성자가 여러 게시물을 작성할 수 있기 때문에) 일대 다 관계로 두 개의 테이블 (게시물과 작성자)이 있습니다. 나는 70 개 게시물 60,000 저자있어

 
Authors: 
    id:BIGINT, name:VARCHAR(255) 

Posts: 
    id:BIGINT, author_id:BIGINT, body:TEXT 

:

그래서 여기에 테이블입니다.

내가 저자를 선택하는 경우 (예 : author_id = 45)와 내가 원하는 내가 그 쓴 임의의 게시물을 작성 :

SELECT * FROM Posts WHERE author_id = 45 ORDER BY RAND() LIMIT 1; 

나는 이것이 바로 알고,하지만 난 온라인 4000 동시 명을 가지고 할 때 소요 약 6 초 ..

Posts 테이블의 author_id 열을 인덱싱하면 속도가 빨라질 수 있습니까?

감사합니다. :)

답변

2

예, 확실히 색인을 추가해야합니다. 당신이하지 인덱스 author_id에있는 경우

EXPLAIN SELECT * FROM Posts WHERE author_id = 45 ORDER BY RAND() LIMIT 1; 
+0

이 구문과 다른 색인을 추가하는 구문이 있습니까? ALTER TABLE 게시물 ADD INDEX (author_id) – checcco

+0

예, 해당 구문이 다릅니다. :-)'ALTER TABLE'은 데이터베이스간에 이식성이 좋지 않지만'CREATE INDEX'는 꽤 이동이 편리합니다. 나는 SQL을 싫어하므로 휴대용 물건 만 암기했다. –

5

인덱싱은 가장 인기있는 WHERE 절 시나리오를 반영해야합니다.

이 특정한 경우에, 색인을 만든 다음 여기에 쿼리를 변경합니다

SELECT id,author_id,body 
FROM Posts 
WHERE author_id = 45 
ORDER BY RAND() 
LIMIT 1; 

이함으로써 성능을 향상 전에 검색에 스키마 조회를 방지 할 수 있습니다.

SELECT *는 고주파수 쿼리의 경우 악조건입니다.

0

실행

CREATE INDEX Post_author_id ON Posts(author_id); 

으로 증거는 확실히에 1 점을 추가하는 듯. 또한 ORDER BY RAND()가 성능 단점에 대해 책임지지 않음을 확신하지 못합니다. 색인을 추가 해보면 이미 크게 좋아질 것입니다.

0

특히 데이터를 업데이트하는 것보다 훨씬 많은 데이터를 읽는 경우 색인 생성을 설정할 때 관대하십시오. where 절에 포함시킬 모든 항목에 대해 색인을 생성해야합니다.

0

Author_id의 [아마도 clustered] 색인이 확실히 도움이 될 것입니다.

ORDER BY RAND() 부분에 추가 위험 요소가있는 것으로 보입니다. 본질적으로이 절은 SQL이 주어진 Row_id에 대해 각 행에 동적으로 난수를 할당하고이를 순서화합니다. 일부 다작 작가가 수백, 수천 개의 게시물을 가지고 있기 때문에 병목 현상이 될 수 있습니다.

0

author_id가 외래 키인 경우 색인을 만들 필요가 없습니다. 내장 색인이 있습니다.