2013-07-24 3 views
0

세 개의 테이블이 있습니다. 고유 색인과 더 빠른 조회를위한 두 개의 다른 열 (두 개의 다른 열)이 있습니다. 세 개의 열 테이블에 기본이 아닌 두 개의 인덱스가 있습니다.

+-------------+-------------+----------+ 
| category_id | related_id | position | 
+-------------+-------------+----------+ 

때때로 쿼리가

SELECT * FROM table WHERE category_id = foo

하고 때로는

SELECT * FROM table WHERE related_id = foo

그래서 내가 category_idrelated_id 성능 향상을 위해 인덱스 모두를하기로 결정합니다. 이 나쁜 습관인가? 이 접근법의 단점은 무엇입니까?

이미 해당 테이블에 100.000 개의 행이 있고 또 다른 100.000을 삽입하고있는 경우 과잉이 될 것입니다. 새로운 삽입마다 색인을 새로 고쳐야합니까? 그 수술이 너무 오래 걸릴까요? 감사합니다

+0

각 색인을 하나의 색인으로 만들었습니까? 좋아. 단점은 삽입 또는 업데이트시 색인을 유지 관리해야한다는 것입니다. 일반적으로 너무 많은 오버 헤드가 없습니다. – Randy

+0

예, 각 하나. 따라서, 이미 그 테이블에 100.000 개의 행이 있고 또 다른 100.000을 삽입하고있는 경우, 이는 새로운 삽입물이있을 때마다 인덱스를 새로 고쳐야하는 잔인한 행동일까요? 그 수술이 너무 오래 걸릴까요? – srgb

답변

0

색인이있는 것이 좋습니다. 인덱스가 더 많은 디스크 공간을 차지하지만 검색 속도는 더 빨라진다는 것을 이해하십시오.

반복되는 값이 적은 필드를 색인화하는 것이 가장 좋습니다. 예를 들면. 부울 플래그를 포함하는 필드를 인덱싱하는 것은 좋은 생각이 아닙니다.

귀하의 경우에는 id이 있으니 작성한 색인을 유지하는 데 문제가 없을 것입니다.

또한 삽입은 느리지 만 id's을 저장하기 때문에 삽입하는 데 시간 차이가 거의 없습니다. 계속해서 삽입하십시오.

내 개인적인 조언 : 한 테이블에 많은 수의 행을 삽입하는 경우 필수가 아닌 한 단일 쿼리를 사용하여 삽입하지 마십시오. 이렇게하면 테이블이 잠겨있어 오랫동안 액세스 할 수 없게됩니다.

+0

감사합니다. 추가 한 질문에 대한 답변을 제공해 주시겠습니까? – srgb

+0

답변이 업데이트되었습니다. – Manu

1

원하는대로 정확히 수행하는 경우 단점이 없습니다. 특정 열을 많이 쿼리하면 해당 열을 인덱싱 할 수 있습니다. 전체 지점입니다. 이제는 60 개의 컬럼 테이블이 있으며 쿼리하지 않은 컬럼에 인덱스를 추가하면 INSERT/UPDATE/DELETE 조작에서 인덱스를 유지해야하기 때문에 자원을 낭비하게됩니다.

+0

감사합니다. 추가 한 질문에 대한 답변을 제공해 주시겠습니까? – srgb

1

각 열에 대해 색인을 작성한 경우 확실히 이점을 얻을 수 있습니다.

복합 색인 (여러 개의 coulmn 색인)으로 이동하지 마십시오.

EXPLAIN을 사용하여 쿼리의 인덱스 이점을 볼 수 있습니다 (문은 MySQL이 명령문을 실행하는 방법에 대한 정보를 제공합니다).

예 :이 도움이 될 것입니다

EXPLAIN SELECT * FROM table WHERE category_id = foo; 

희망.

~ K

관련 문제