2009-10-13 4 views
0

와 indices 지금까지 내가 우리의 코드는 모든 인덱스, 아직 몇 가지 정보를 사용하여 말할 수불필요한 MySQL은 우리가 꽤 큰 것으로부터 우리의 데이터베이스에있는 우리의 테이블 중 하나가

show index from entries; 
+---------+------------+----------------------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ 
| Table | Non_unique | Key_name        | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | 
+---------+------------+----------------------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ 
| entries |   0 | PRIMARY        |   1 | id   | A   | 13538389 |  NULL | NULL |  | BTREE  |   | 
| entries |   0 | index_entries_on_link_and_feed_id  |   1 | link  | A   | 13538389 |  NULL | NULL | YES | BTREE  |   | 
| entries |   0 | index_entries_on_link_and_feed_id  |   2 | feed_id  | A   | 13538389 |  NULL | NULL | YES | BTREE  |   | 
| entries |   0 | index_entries_on_unique_id_and_feed_id |   1 | unique_id | A   | 13538389 |  NULL | NULL | YES | BTREE  |   | 
| entries |   0 | index_entries_on_unique_id_and_feed_id |   2 | feed_id  | A   | 13538389 |  NULL | NULL | YES | BTREE  |   | 
| entries |   1 | index_entries_on_feed_id    |   1 | feed_id  | A   |  81556 |  NULL | NULL | YES | BTREE  |   | 
| entries |   1 | index_entries_on_time     |   1 | time  | A   |  967027 |  NULL | NULL | YES | BTREE  |   | 
| entries |   1 | index_entries_on_created_at   |   1 | created_at | A   |  846149 |  NULL | NULL | YES | BTREE  |   | 
+---------+------------+----------------------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ 
8 rows in set (1.35 sec) 

:

/그래서 내가 인덱스를 보여 주었다 : 데이터 자체로 거의 두 배 크다 중복 될 수 있습니다 : index_entries_on_feed_idindex_entries_on_link_and_feed_idindex_entries_on_unique_id_and_feed_id 모두 사용하기 때문에 색인이 중복 될 수 있습니다.

맞습니까?

+0

feed_id가 순서대로 첫 번째 필드가 아니기 때문에 MySQL에서 * 다른 * 색인을 사용하지 않을 것으로 기대합니다. 인덱스가 때때로 데이터보다 많은 공간을 차지한다는 것에 놀랄 필요는 없습니다. – Joe

+0

흥미 롭습니다. 즉, index_entries_on_link_and_feed_id 또는 index_entries_on_unique_id_and_feed_id 중 하나에서 순서를 변경하면 index_entries_on_feed_id 인덱스가 필요하지 않습니까? –

답변

2

몇 가지 관찰 ... 이

은 당신이 그들을 삭제할 수 있도록 같은, 심지어 크기가 동일하다 index_entries_on_unique_id_and_feed_id index_entries_on_link_and_feed_id 정말 유일하다면, feed_id가 정말로 필요한지주의 깊게 확인해 볼 것입니다. 하나의 필드를 조회하더라도 성능이 매우 떨어집니다.

id (기본)와 unique_id의 차이점은 무엇입니까?

상대적으로 작은 행에 여러 가지 방법으로 색인을 생성하는 경우 인덱스가 데이터보다 많은 공간을 사용하는 것이 가능합니다.

10M 개의 행은 전체를 스캔하지 않는 한 실제로는 그렇게 크지 않습니다. 어떤 경우에는 너무 큽니다. 쿼리를 제공하면 인덱스를 적절히 사용하므로 다른 100M 행 이상은 중요하지 않습니다.

2 개 또는 3 개의 테이블 조인을 포함하여 다소 복잡한 쿼리를 작성하는 경우 EXPLAIN을 사용하여 쿼리 계획을 확인하는 것이 좋습니다. 복잡한 MySQL 쿼리를 수동으로 튜닝하여 놀라운 개선이있었습니다.

+0

감사합니다. 마이크. unique_id는 실제로 '외부 데이터'이므로 이름이 잘못된 것일 수 있습니다. 실제로 우리는 DB에서 고유하지는 않지만 외부 데이터의 맥락에서 고유하다는 것을 알았습니다. (예를 들어 ATOM 피드 항목 인 경우 요소로 생각하십시오.) 좋아, 그럼, 우리 상황이 괜찮을 것 같아. 우리는 지금까지 실제 성능에 영향을 미치지 않습니다 ...이 DB에는 많은 쓰기가 있고 아주 적은 선택 (80 %/20 %)이 있기 때문에 미래의 확장성에 대해 "과도 색인"이 아닌지 확인하고 싶습니다. 색인 문제. –

-1

EXPLAIN 다음에 SQL 쿼리를 사용하여 사용 된 인덱스에 대한 정보를 얻을 수 있습니다. 일부 색인을 사용하지 않는 경우 색인을 삭제할 수 있습니다.

또한, 귀하의 지표 :

UNIQUE_ID 경우 : 는

+0

음, 아니, 그들은 서로 다른 지표입니다! 그리고 그들은 다른 쿼리에서 사용됩니다 :// 예, 우리는 EXPLAIN을 사용했고 모든 인덱스가 사용되었습니다 ... 하나를 삭제하면 쿼리 해결자가 다른 쿼리를 사용하려고 시도하지 않습니다./ –

관련 문제