2010-06-10 2 views
0

나는 많은 다른 연산을 수행하는 (mysql에 저장되어있는) 많은 도메인 엔티티를 가지고있다. 각 작업은 다른 프로그램에서 실행됩니다. 나는 비트 필드 (bitet)로 사용되는 긴 필드 'flowstate'로 구현 된 이러한 엔티티들에 대해 (플로우) 상태를 유지할 필요가있다. 은 컬럼에 대해서만 비트 연산을 수행 할 때 '상태'컬럼에 유용한 mysql 인덱스인가?

내가 같은 것을 할 특정 조작받은 기관에 대한 MySQL의 쿼리 : (작업 7 cooresponding) 비트 7을 나타내는

select * from entities where state >> 7 & 1 = 1 

을 실행하고있다. (< - 간략화)

어쨌든, 처음에는이 설정의 성능 관련 사항에 신경을 쓰지 않았고 위의 쿼리가 꽤 느리게 실행되기 때문에 약간 문제가 있다고 생각합니다.

내가 알고 싶은 점 : 'flowstate'의 mysql 색인이 도움이 되나요? 결국 Mysql이 바이너리 정렬 등을 사용하여 신속하게 찾을 수있는 단일 값이 아닙니다.

그렇지 않다면 속도를 높이기 위해 할 수있는 다른 일이 있습니까? . 위와 같은 유스 케이스가있는 필드에 대한 특별한 '마스크 인덱스'가 있습니까?

TIA, 거트 얀

답변

0

내가 MySQL이이 경우에 인덱스를 사용하기위한 어떤 방법이 생각하지 않습니다. 당신은 비트가 항상 왼쪽에서 오른쪽, 또는 왼쪽에서 오른쪽, 또는 어떤 특정 순서로, 당신은 당신이 선택해야 할 행의 수를 제한 할 몇 가지 트릭을 할 수 있습니다 세트있어 것을 알고있는 경우 :

... where state < ? and state > ? and ... 

그런 경우라면 상태에 대한 색인이 유용 할 것입니다. 그것은 아마도 긴 샷이다. 그렇지 않으면 스키마를 수정하는 것이 가장 좋습니다.

+0

불행히도 미리 정의 된 순서는 아닙니다. 예 : 프로그램의 결과에 따라 비트 7 또는 8이 설정 될 수 있습니다. 재 설계를 살펴 보겠습니다. –

0

문에 EXPLAIN을 사용하여 테이블에 액세스하는 방법을 확인하십시오. 필드에 인덱스를 넣고 EXPLAIN을 다시 실행하여 MySQL이 MySQL을 사용하는지 확인하는 것이 좋습니다. 테이블이 상당히 큰 경우 결과간에 명백한 성능 차이가 있어야합니다.

+0

옙 거기에 약간의 차이가 있지만, 내가 바라는 바가 거의 없다. 이미 색인을 제 자리에 가지고 있었고, 단지 내가하고 싶은 것을 위해 설계되지 않았다. –

관련 문제