2014-10-12 2 views
1

어때요? 나는 이것이 복제본으로 간주되지 않기를 바라고 있습니다 ... mysql two column primary key with auto-incrementMysql 인덱싱 모범 사례

다른 데이터베이스를 참조하려고하지는 않지만 내 질문은 약간 다릅니다. 나는 이것에 대해 가장 잘하는 방법을 알고 싶다 ... primary key으로 page_id라고하는 주석 테이블을 갖고 싶지만 각 행과 관련된 자동 증가 ID가 여전히 필요하다. 그래서 그들을 업데이트하거나 삭제할 때 ID로 대응할 수 있습니다.

id INT(8) NOT NULL AUTO_INCREMENT, 
page_id INT(5) NOT NULL, 
comment VARCHAR(2500) NOT NULL, 
PRIMARY KEY (id) 

을 다음과 내 쿼리의 모습으로 지금부터 내 표는

SELECT comment FROM comments WHERE page_id = '$page_id' AND id >= $start_at_id 

내가 MySQL의 최적화 비디오의 무리를보고있다 그리고 나는에 인덱스를 듣고 계속 .... 구성되어있다 왼쪽,하지만 내 문제는 대부분의 눈이 멀어서 코드 예제를 볼 수 없다는 것입니다. 여기서 내 스크린 리더는 모든 것을 가능하게 할 것입니다. 내 질문은 이것입니다. 같이 테이블을 설정하는 것이 더 낫겠습니까 ...

page_id INT(5) NOT NULL, 
id INT(8) NOT NULL AUTO_INCREMENT, 
comment VARCHAR(2500) NOT NULL, 
PRIMARY KEY (page_id) 

그리고 그렇다면 ... 쿼리를 구조화하는 더 좋은 방법은 무엇입니까? "start_at_id"는 페이지 매김 페이지가 아니면 0입니다. 내가 믿는 mysql 5.6에 대한 기본 엔진을 사용하고있다. (내 철자를 용서한다.) isam ???

미리 감사드립니다. 당신이 Id 열이 SELECT comment FROM comments WHERE page_id = '$page_id' AND id >= $start_at_id이 WHERE 절에 Id 열을 사용하는 primary key 인덱스 자체 및 쿼리를 가지고 있기 때문에 모든에 수정을 추가 할 필요가 없습니다처럼

+0

다음을 제외하고 모든 문자로 구성된 MyISAM이 철자가 있습니다 (M, Y, I, S, A, M) 대문자로 된 'y'- 스크린 리더를 사용할 때 단어 철자가 얼마나 쉬운 지 확실하지 않습니다. 그러나 MyISAM은 더 이상 디폴트 스토리지 엔진이 아니며 기본값은 InnoDB입니다. –

+0

또한 두 번째 테이블 스키마 예제 (PRIMARY KEY로'page_id'를 사용하는)는 나에게 의미가 없습니다; 아마도 페이지 당 여러 개의 주석을 가질 수 있으므로'page_id'는 주석 테이블에서 고유하지 않습니다. PRIMARY KEY는 고유성 제약 조건을 의미하므로 성능을 제쳐두고 - 두 번째 접근 방식은 작동하지 않습니다. –

답변

0

보인다. 따라서 더 이상 색인이 필요 없습니다. page_id 열에 색인을 추가 할 수 있습니다. 하지만 내 경험에 의하면 QUERY에 차이가 없습니다. 그러나 page_id 검색어 만 확실히 속도가 향상됩니다. page_id 최적화를위한 아주 좋은 무엇 일정하기 때문에 쿼리에 대한

+0

이 답변에 대한 빠른 후속 질문 ... 내 쿼리가 속도가 빨라지거나 일반적으로 쿼리에서 AND 절을 제거하면 인덱스를 page_id 열에 추가하면 속도가 빨라진다는 것을 의미합니까? 쪽으로? 나는 처음에 그것을 더 분명하게해야했다. 초기 페이지에는 AND 절이 없으므로 통찰력 덕분에 더 이상 절을 필요로하지 않을 때 사용할 수 있습니다.> = 0이기 때문에 바보입니다. 또한 LIMIT 51 이후에 LIMIT 51을 넣는 것을 잊어 버렸습니다. 위의 모든 것.그 추가 1을 사용하여 다음 링크를 추가해야 하는지를 결정한 다음 AND> = id라고 말합니다. – Ian

0

당신의 최선의 사용 색인이 인

ALTER TABLE comments ADD UNIQUE INDEX myIndex USING BTREE (page_id, id) 

될 것이다. 그러나 id에> =를 지정하면 HASH 색인 유형을 사용하지 마십시오. BTREE은 (기본값)이 동등/불균등 비교에 가장 적합합니다 (here 참조).

+0

이것도 좋은 생각 같습니다. 시간이 걸리면 alter 문을 사용하지 않고 테이블을 만들 때이를 올바르게 구현하는 방법에 대한 예제를 던질 수 있습니다. 통찰력에 다시 한번 감사드립니다. – Ian

+0

CREATE TABLE (..., 고유 INDEX myIndex USING BTREE (page_id, id)) – Benvorth