2012-01-30 2 views
1

인덱싱에 관한 한, SELECTS의 속도를 높이기 위해 WHERE 절에서 검색 할 모든 필드를 인덱싱하는 것이 적절합니까? 예를 들어 내 데이터베이스에는 이름, intrestCode, zip, 설명 및 전자 메일과 같은 사용자 정보를 저장하는 프로필 테이블이 있습니다. 프로파일 레코드는 사용자 ID와 고유하게 일치하는 PRIMARY id 컬럼으로 식별됩니다. 프로필은 zip 및 intrestCode (SELECT `blah`,`blah`... FROM profile WHERE zip=?, SELECT `blah`,`blah`... FROM profile WHERE zip=? && intrestCode=?)로 검색되므로 zip 및 intrestCode 인덱스를 만들었습니다. 내가 제대로하고 있니?올바른 인덱싱 MySQL

답변

3

기본적으로 올바른 소리입니다. 당신은 당신이 동일한 쿼리에서 같은 테이블에 두 개의 서로 다른 인덱스를 사용할 수 없다는 것을 알고, 그렇게해야 당신은 실행 한 경우

CREATE INDEX `zip` ON `profile` (`zip`); 
CREATE INDEX `intrestCode` ON `profile` (`intrestCode`); 

다음 쿼리

SELECT `blah`,`blah`... FROM profile WHERE zip=? && intrestCode=? 

단지에서 하나 개의 테이블을 찾아 볼 수 있습니다 색인 여기에 비밀은 당신과 같이, 두 개의 테이블에 단일 인덱스를 만들 수 있다는 것입니다 :

CREATE INDEX `zip+intrestCode` ON `profile` (`zip`, `intrestCode`); 

MySQL은 WHERE 절에서 혼자 두 zip을 사용하는 쿼리에 대해이 작업을 사용하거나 사용 모두 zipintrestCode 있지만 WHERE 절에 intrestCode 만 사용하는 쿼리

(이것은 각 인덱스는 전체 테이블을 포함되기 때문이다. MySQL이 시도하고 다른 테이블에서 zipintrestCode을 본다면, 두 번째 인덱스에서 관련이없는 행의 다음이 검색 될 많은. 따라서, 그것은 단지 본다 하나의 인덱스. 두 컬럼 모두에서 인덱스를 사용하려면 두 컬럼을 모두 포함하는 하나의 인덱스가 필요합니다.)

+0

문제는 내가 사용자가 검색하는 방법을 몰라을 변경합니다. 일부는 우편 번호로만 검색하고 일부는 관심사로 검색하기를 원할 수도 있고 다른 일부는 모두 검색하려고 할 수도 있습니다. 이것은 일반적인 사건처럼 보입니다. 해결책이 없습니다 (많은 테이블이 부족합니다)? 멀티 컬러 색인을 만들고 미사용 필드를 와일드 카드로 작성하면 효과가 있습니까? Zip 전용 : SELECT * FROM profiles 여기서 zip =? && intrestCode LIKE '%'. Intrest code 만 해당 : SELECT * from WHERE zip LIKE '%'&& intrestCode =? 둘 다 : 프로필에서 SELECT * WHERE zip =? && intrestCode =? – user974896

+0

아니요 필드 간에는 엄격한 관계가 있어야합니다. 두 개의 필드가 있다면'zip'과'intrestCode'와'intrestCode'만으로 두 개의 인덱스를 쉽게 생성 할 수 있습니다. 필드가 더 많은 경우 모든 조합을 설명하기가 어려워집니다. 이 시점에서 각 필드에 대해 하나의 인덱스를 작성하고 옵티마이 저가 최상의 옵션을 선택하도록하는 것이 가장 좋습니다 (이벤트는 동일한 종류의 효율성 향상을 얻을 수는 없지만). DB의 크기에 따라 다중 열 인덱스를 만드는 것은 가치가 없을 수도 있습니다. 여기에는 몇 가지 판단이 필요합니다. –

+0

한 가지 더 궁금한 점이 있습니다. 실제로 많은 조합을 감추기 위해 몇 가지 지표가 추가 될 것입니다 (UPDATE, INSERT 또는 SELECT 시간이 오는가?), 아니면 디스크 공간면에서 비용이 많이 듭니다. 디스크 공간은 저렴한 비용으로 거의 무한한 자원입니다. – user974896

0

나는 기본적으로 그렇다고 믿습니다. 추가. 제 점이 _ 생하도록 데이터베이스를 모니터하고 결과에 따라 조회 W 테이블을 최적화해야합니다.

1

인덱싱 관계 데이터베이스는 약간 예술입니다. 가장 좋은 방법은 관련된 모든 쿼리를보고 관련된 인덱스에 인덱스를 넣는 것입니다. 쿼리가 사용할 인덱스를 보려면 EXPLAIN을 사용하십시오.

그러나 MySQL은 한 번에 테이블의 인덱스 하나만 사용할 수 있습니다. 따라서 한 번에 여러 열에 인덱스를 넣을 수 있습니다. 또한 인덱스 시작 부분에 열만 있으면 MySQL은 다중 열 인덱스를 사용할 수 있습니다. 귀하의 예제에서, 나는 다중 열 인덱스 zipintrestCode을 함께 두 쿼리를 도울 것이므로 넣어 것입니다. 그렇게하면 zip에 별도의 색인이 필요하지 않습니다.

+0

는 어떻게 하나의 최대 속도는 WHERE'zip' = profiles''로부터'email','name'을 선택 것인가? &&'intrestCode' =? . 보시다시피 2 열을 사용합니다. 2 개의 별도 색인을 사용하지 않겠습니까? – user974896

+0

당신은 다중 열 인덱스를 수행합니다'TABLE 프로파일 추가 INDEX (우편, intrestCode)' – staticsan

0

일반적으로 where 절에 참여하거나 where 절에 포함 할 컬럼에 인덱스를 추가하려고합니다 . 두 열의 인덱스는 두 열의 인덱스 각각과 다릅니다. 또한 여러 열에 대한 색인이있는 경우 순서가 중요합니다.

두 개의 열 A와 B가 있고 A와 B의 순서로 두 개의 열 인덱스가 있다고 가정 해 보겠습니다.삼가지 경우가 있습니다

열 A에 대한 절
  1. : 인덱스가
  2. 을 사용하지 않는 열에 대한 절과 B : 인덱스가 사용되는 열 B에 대한 절
  3. 인덱스가 사용됩니다

통계와 마찬가지로 색인 생성은 예술이며 100 % 시간을 적용하는 규칙은 없습니다. Explain 계획을 사용하여 쿼리가 수행되는 방식을 확인하고 적절하게 조정하십시오.