2013-11-28 2 views
9

MySQL 인덱스를 배우고 있고 인덱스가 SELECT 쿼리의 WHERE 절에 지정된 모든 열에 적용되어야한다는 것을 알았습니다.MySQL 초보자 - 여러 열 인덱스

그런데 Multiple Column Index vs Multiple Indexes을 찾았습니다.

첫 번째 질문은 여러 열 인덱스가 무엇인지 궁금합니다. 나는 Joomla에서 코드 울부 짖음을 발견,이 여러 열 인덱스 무엇입니까?

CREATE TABLE `extensions` (
    `extension_id` INT(11) NOT NULL AUTO_INCREMENT, 
    `name` VARCHAR(100) NOT NULL, 
    `type` VARCHAR(20) NOT NULL, 
    `element` VARCHAR(100) NOT NULL, 
    `folder` VARCHAR(100) NOT NULL, 
    `client_id` TINYINT(3) NOT NULL, 
    ... ... 
    PRIMARY KEY (`extension_id`), 

    // does code below is multiple column index? 

    INDEX `element_clientid` (`element`, `client_id`), 
    INDEX `element_folder_clientid` (`element`, `folder`, `client_id`), 
    INDEX `extension` (`type`, `element`, `folder`, `client_id`) 
) 

두 번째 질문 하나의 SELECT에 하나의 다중 열 색인이 사용된다고 생각하면 두 번째 질문이 맞습니까? 인덱스에 대한 엄지 손가락의

SELECT column_x WHERE element=y AND clinet_id=y; // index: element_clientid 

SELECT ex.col_a, tb.col_b 
    FROM extensions ex 
    LEFT JOIN table2 tb 
    ON (ex.ext_id = tb.ext_id) 
    WHERE ex.element=x AND ex.folder=y AND ex.client_id=z; // index: element_folder_clientid 

답변

20

일반 규칙은 WHERE 또는 JOIN 절에 사용되는 모든 필드에 하나를 때리고있다.

그런데, 당신이 할 수있는 몇 가지 최적화가 있습니다. KNOW 특정 테이블의 WHERE에서 사용되는 필드의 특정 조합 만있는 경우 해당 필드에 단일 멀티 필드 키를 만들 수 있습니다 (예 :

INDEX (field1, field2, field5) 

v.s.

INDEX (field1), 
INDEX (field2), 
INDEX (field5) 

다중 필드 색인은 많은 경우에 더 효율적일 수 있으며, vs는 여러 색인을 스캔해야합니다. 단점은 해당 필드가 실제로 WHERE 절에서 사용되는 경우에만 다중 필드 인덱스를 사용할 수 있다는 것입니다.

예제 쿼리에서는 elementfield_id이 세 가지 인덱스에 모두 포함되어 있으므로 전용 인덱스로 분리하는 것이 좋습니다. 이러한 필드가 변경 가능한 경우 자체 전용 인덱스로 유지하는 것이 좋습니다. 예 : field_id을 대량으로 변경해야하는 경우 DB는 3 가지 다른 인덱스 v.sys를 업데이트해야합니다. 하나의 전용 업데이트 중.

그러나 벤치마킹은 다양한 색인 설정으로 특정 설정을 테스트하고 어떤 것이 가장 잘 수행되는지 확인하는 것입니다. 엄지 손가락 규칙은 편리하지만 100 % 일하지 않습니다.

+0

예, 필드 1을 기준으로 테스트를 수행하고 다른 필드는 자동으로 인덱싱됩니다. 그러나 element와 field_id를 독립적으로 분리하는 것에 대해서는 확신하지 못합니다. – qaharmdz