2013-08-05 2 views
1

에 고유 제한 조건으로 포함하는 인덱스를 결합 : 필드 이름이 고유 제한 조건을 가지고에는 다음 필드가있는 테이블을 고려 MySQL의

mysql> DESCRIBE my_table; 
+-------+--------------+------+-----+---------+-------+ 
| Field | Type   | Null | Key | Default | Extra | 
+-------+--------------+------+-----+---------+-------+ 
| pk | int(11)  | NO | PRI | NULL |  | 
| name | varchar(20) | NO | UNI |   |  | 
| value | varchar(255) | NO |  |   |  | 
+-------+--------------+------+-----+---------+-------+ 
3 rows in set (0.01 sec) 

알 수 있습니다.

나는 다음과 같은 쿼리를 최적화 할 말 있습니다 :

SELECT name, value 
FROM my_table 
WHERE name = 'my_name' 

이미 (때문에 독특한 제약 조건)을 name 필드에 대한 인덱스가 있습니다,하지만 덮개를 가지고 더 나은 것 필드의 인덱스는 value입니다. 내가 커버링 인덱스를 추가하려고하면 그것은으로 나타납니다

ALTER TABLE my_table ADD INDEX idx_name_value (name, value); 

지금

mysql> EXPLAIN 
    -> SELECT name, value 
    -> FROM my_table 
    -> WHERE name = "my_name"; 
+----+-------------+----------+-------+---------------+------+---------+-------+------+-------+ 
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | 
+----+-------------+----------+-------+---------------+------+---------+-------+------+-------+ 
| 1 | SIMPLE  | my_table | const | name   | name | 62  | const | 1 |  | 
+----+-------------+----------+-------+---------------+------+---------+-------+------+-------+ 

: 놀라운

고유 제한 조건에 대한 하나 개의 인덱스와

, 아무것도 내가 EXPLAIN 명령을 실행할 때 발생하지 쿼리의 후보이지만 선택되지 않았습니다! 그래서

mysql> EXPLAIN 
    -> SELECT name, value 
    -> FROM my_table 
    -> WHERE name = "my_name"; 
+----+-------------+----------+------+----------------+----------------+---------+-------+------+--------------------------+ 
| id | select_type | table | type | possible_keys | key   | key_len | ref | rows | Extra     | 
+----+-------------+----------+------+----------------+----------------+---------+-------+------+--------------------------+ 
| 1 | SIMPLE  | my_table | ref | idx_name_value | idx_name_value | 62  | const | 1 | Using where; Using index | 
+----+-------------+----------+------+----------------+----------------+---------+-------+------+--------------------------+ 

가 어떻게 커버링 인덱스를 사용할 수 있습니다 여전히 고유 한이 : 나는 고유 제한 조건을 제거하면 예상대로

ALTER TABLE my_table DROP INDEX name; 

커버링 인덱스가 작동

mysql> EXPLAIN 
    -> SELECT name, value 
    -> FROM my_table 
    -> WHERE name = "my_name"; 
+----+-------------+----------+-------+---------------------+------+---------+-------+------+-------+ 
| id | select_type | table | type | possible_keys  | key | key_len | ref | rows | Extra | 
+----+-------------+----------+-------+---------------------+------+---------+-------+------+-------+ 
| 1 | SIMPLE  | my_table | const | name,idx_name_value | name | 62  | const | 1 |  | 
+----+-------------+----------+-------+---------------------+------+---------+-------+------+-------+ 

공지 사항 강제?

답변

0

고유 한 제약 때문에 이름 필드에 대한 인덱스가 이미 있지만 필드 값에도 커버 인덱스가있는 것이 좋습니다.

아니요 고유 제한 조건을 사용하면 "무료"라는 이름에 대한 색인을 얻을 수 있습니다. 그리고 당신이 이름만으로 검색하고 있기 때문에, 당신은 가치가있는 (결합 된) 색인을 필요로하지 않습니다.

where 절에 값이있는 쿼리를 사용할 때만 인덱스의 이점을 얻을 수 있습니다.

인덱스 (이름, 값)를 조합하면 값을 검색하지 않을 때 오버 헤드가 발생하므로 인덱스를 사용하지 않아도됩니다. 삽입/업데이트 작업에서 인덱스를 업데이트해야하며 이로 인해 성능이 저하 될 수 있습니다.

+0

표지 인덱스의 목적을 오해하고 있습니까? 데이터가 인덱스에 이미 포함되어 있으므로 레코드를 조회 할 필요가 없기 때문에 데이터 검색 속도를 높이는 것이 목적이라고 생각했습니다. – alexpirine