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을 신뢰해야하는지 이해하고 싶습니다.
는 "이 테이블은 모든 INDEX 말이 어디 다른 열을 필요로하는 다른 쿼리에 의해 액세스되는 것을 우리는 가정 할 수있다"무엇을 의미합니까? 그러한 쿼리에 대한 몇 가지 예를 들려 줄 수 있습니까? 당신은 또한'SHOW INDEXES FROM table' 질의의 출력을 줄 수 있습니까? A, AB 및 AC의 인덱스는 확실히 중복됩니다.이 인덱스는 이미 ACD/ABC, ABC 및 ACD의 인덱스로 각각 다룹니다. – Daan
예제 쿼리 : 'B 테이블에서 B를 얻는다. B = 12'. MySQL에서 멀티 컬럼 인덱스를 처리하는 방법에 대한 정보는 http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html에서 얻을 수있다. 좋아, 나는 A, AB, AC (감사)를 제거 할 수있다. 그러나 'ACD'사용 이유는 아직 밝혀지지 않았습니다. 'D'가'WHERE' 문 안에조차 없을 때. –
네, 약간 이상합니다 : SHOW INDEXES FROM table 쿼리의 결과는 왜 그런지 알 수 있습니다. – Daan