2012-03-22 3 views
13

INT의 열이있는 200k 개의 항목이있는 테이블이 있습니다. 쿼리를 더 빠르게 만들 수있는 인덱스를 만들고 싶습니다. 이것은 실행하고자하는 쿼리입니다 : SELECT A,B,C,D,E FROM table WHERE A=23 and (B=45 or C=43). 다음 인덱스를 만들었습니다 : B, ACD, C, ABC. 내가 MySQL이 인덱스 ACD를 선택하는 것을 발견 EXPLAIN 명령을MySQL. "OR"쿼리에 대한 인덱스 만들기

. 그래서 더 많은 값으로 테이블을 채우고 MySQL이 위의 인덱스간에 전환하고 있다는 것을 깨달았습니다 (항상 같은 것은 아님).

가 성능 문제의 원인이됩니다 다양한 인덱스를 가진 많은 삽입, 그리고 우리는이 테이블의 모든 인덱스가 의미가 다른 경우 열을 필요로하는 다른 쿼리에 액세스한다고 가정 할 수 있기 때문에.

은 내가 USE INDEX() 알고있다, 그러나 나는 우리가 올바른 인덱스를 선택하는 MySQL을 신뢰해야하는지 이해하고 싶습니다.

+2

는 "이 테이블은 모든 INDEX 말이 어디 다른 열을 필요로하는 다른 쿼리에 의해 액세스되는 것을 우리는 가정 할 수있다"무엇을 의미합니까? 그러한 쿼리에 대한 몇 가지 예를 들려 줄 수 있습니까? 당신은 또한'SHOW INDEXES FROM table' 질의의 출력을 줄 수 있습니까? A, AB 및 AC의 인덱스는 확실히 중복됩니다.이 인덱스는 이미 ACD/ABC, ABC 및 ACD의 인덱스로 각각 다룹니다. – Daan

+0

예제 쿼리 : 'B 테이블에서 B를 얻는다. B = 12'. MySQL에서 멀티 컬럼 인덱스를 처리하는 방법에 대한 정보는 http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html에서 얻을 수있다. 좋아, 나는 A, AB, AC (감사)를 제거 할 수있다. 그러나 'ACD'사용 이유는 아직 밝혀지지 않았습니다. 'D'가'WHERE' 문 안에조차 없을 때. –

+0

네, 약간 이상합니다 : SHOW INDEXES FROM table 쿼리의 결과는 왜 그런지 알 수 있습니다. – Daan

답변

6

유용 할 것입니다.

나는 방법이 INDEX 두 개의 별도의 쿼리를 만드는 것입니다 사용하여이 문제를 해결하는 결론에 도달했습니다. 을 사용하고 SELECT A,B,C,D,E FROM table WHERE A=23 AND C=43을 사용하는 SELECT A,B,C,D,E FROM table WHERE A=23 AND B=45INDEX ACD을 사용합니다. 이 작업은 모두 (...) UNION (...)으로 한 번에 수행 할 수 있습니다.이 작업은 더 빠르며 INDEX 만 사용합니다.

1

Mysql은 복합 색인의 '가장 왼쪽'부분 만 사용할 수 있습니다.

WHERE A=1 AND B=2 

다음 MySQL이 A 또는 AB에 인덱스를 사용할 수 있지만, AB 가장 것 같은 즉, 당신의 where 절 보이는 경우. ACB 인덱스를 다른 열로 나눌 때 사용할 수 없음

주어진 WHERE 절을 사용하면 MySQL 쿼리 엔진이 여러 인덱스를 사용할 수 있다고 생각하지 않습니다. ABAC을 만들고 FORCE INDEX를 사용하여 어느 것이 더 빠르는지 확인하십시오. 당신은 하나 개의 다른 컬럼에 대 한 찾고 있습니다로

3 열로 된 복합 키는이 경우 도움이되지 않습니다. 쿼리가 OR 대신 AND을 사용하는 경우 이러한 종류의 키가 도움이됩니다. SQL 문에서 OR의, MySQL은 단순히 ACD입니다 A을 포함하는 첫 번째 인덱스를 받고 있기 때문에 ABC에 대한 인덱스는

WHERE A=1 AND B=2 AND C=3 
+2

예, AND로 예상대로 ABC 쿼리를 사용합니다. 'A','AB','AC'를 사용하면 이전에 @ Daan이 언급 한 것처럼 중복 될 수 있습니다. MySQL 문서에서 "인덱스의 가장 왼쪽에있는 접두사는 옵티마이 저가 행을 찾는데 사용할 수 있습니다. (INDEX) on (col1, col2, col3), (col1), col1, col2에 대한 검색 기능이 있습니다. (col1, col2, col3). " –

+1

이것은 AND가 아니라 OR에 관한 질문입니다. –