에 고유 제한 조건으로 포함하는 인덱스를 결합 : 필드 이름이 고유 제한 조건을 가지고에는 다음 필드가있는 테이블을 고려 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 | |
+----+-------------+----------+-------+---------------------+------+---------+-------+------+-------+
공지 사항 강제?
표지 인덱스의 목적을 오해하고 있습니까? 데이터가 인덱스에 이미 포함되어 있으므로 레코드를 조회 할 필요가 없기 때문에 데이터 검색 속도를 높이는 것이 목적이라고 생각했습니다. – alexpirine