2014-10-20 2 views
1

다음과 같은 기능을 제공하는 sql 구조가 필요합니다.SQL의 else 절인 경우 인덱스 자동 재구성

select if-expression if status='regular' else else-expression 
from table-name ; 

이 작업은 매우 자주 사용됩니다. 그래서이 작업에 대한 색인을 작성하는 것을 고려 중입니다.

그러나 테이블을 업데이트 한 후에 인덱스가 다시 작성되지 않는다고 들었습니다. 인덱스를 자동으로 다시 생성 할 수있는 방법이 있습니까? 사전

+1

테이블을 변경할 때 유일한 시간 인덱스가 업데이트되지 않습니다 (예 : 대량로드 작업 중에). 일반적으로 그들은 항상 자동 업데이트해야합니다. –

+0

(+1) 원인 : 프로덕션 코드에서 동일한 기능을 사용해야합니다. 매우 흔하지는 않지만 클라이언트/스택 소유자 비즈니스 로직에서 필요로하는 경우가 있습니다. – umlcat

답변

1

명세서의 SQL의 번역

덕분이다 : 당신이 어떤 방법으로 행을 제한하지 않기 때문에

select (case when status = 'regular' then <if-expression> else <else-expression> end) 
from tablename; 

인덱스는이 쿼리에 도움이되지 않습니다. where 절, 조인 및 상관 하위 쿼리에서 필터를 사용하면 인덱스가 도움이됩니다 (가끔은 group by으로 생각합니다).

그리고 MarcB가 주석에서 지적한 것처럼 MySQL (및 다른 모든 데이터베이스)은 삽입, 업데이트 및 삭제 작업을 위해 인덱스를 최신 상태로 유지합니다.

+0

고맙습니다. 그런 쿼리가 수행 될 때마다 컴퓨팅 표현의 오버 헤드를 줄이고 싶다면 무엇을해야하는지 알려주세요. – sandilya

+0

@sandilya. . . 결과 세트가 원본 테이블의 모든 행을 반환하면'status' 열의 비교 오버 헤드는 실제로 무시할 수 있습니다. –

0

더 자세한 예제를 제공하지 않았습니다.

"use-the-index-luke-solution"뿐만 아니라 아이디어에 대한 여러 가지 대안이 있습니다. 그리고 데이터베이스에 많이 의존합니다.

"union"을 사용할 수도 있습니다. 너무 많은 자원을 사용할 수있는 경우도 있으며, 너무 많은 자원을 사용하는 경우에도 최적의 솔루션이 될 수 있습니다.

SELECT 
    <if-expression> 
FROM 
    MyTable 
WHERE 
    (MyTable.status = 'regular') 

UNION 

SELECT 
    <else-expression> 
FROM 
    MyTable 
WHERE 
    (MyTable.status <> 'regular') 

그리고, 어떤 경우에는, 당신은 또한

SELECT 
    <if-expression> 
FROM 
    MyTable 
WHERE 
    (MyTable.status = 'regular') 
ORDER BY <indexed-fields-used-in-expression> 


UNION 

SELECT 
    <else-expression> 
FROM 
    MyTable 
WHERE 
    (MyTable.status <> 'regular') 
ORDER BY <indexed-fields-used-in-expression> 

건배를 추가 할 수 있습니다.