2010-03-04 6 views
2

에 의해/혼합 욱일승천의 ORDER w 쿼리를 최적화 (~는 1M 행 이제 곧 ~ 10M) (일반 데이터 외에)이 위의 열이 있습니다mysql을 : 나는 큰 테이블이

  • avg_visited , % age 인기를 나타내는 float 0-1; 이상은 선험적 순위 때문에 변경할 수없는 외부 정보원으로부터

순위 선험적주는 정수 1-N

  • alexa_rank 좋다. 많은 행이 아직 인기가 없기 때문에 (사용자가 아직 도달하지 않았으므로) 선험적 순위는 대체 주문입니다. 그러나 인기는 이전 엔트리를 업데이트하고 이전에 랭킹이있는 사용자에게 인기를 더하거나, 일부 사용자가 실제로 그것을 쳤을 때 매우 자주 바뀝니다.

    자주 SELECT id, url, alexa_rank, avg_visited FROM 개의 사이트 ORDER BY avg_visited desc, alexa_rank asc LIMIT 49500, 500 (49500의 다양한 값)을 실행합니다.

    그러나, ORDER BY이 MySQL을 5.1, 이노에 http://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html

    당 혼합 욱일승천와 인덱스를 사용할 수 없습니다.

    완전히 상황을 바꿔 완전히 인덱싱 된 쿼리를 제공하려면 어떻게해야합니까?

  • 답변

    1

    불행히도 MySQL은 인덱스에 DESC 절을 지원하지 않으며 파생 식의 인덱스도 지원하지 않습니다.

    당신은 긍정적와 함께 부정적인 인기를 저장하고 그것을 사용할 수있는 ORDER BY :

    CREATE INDEX ix_mytable_negpopularity_apriori ON (neg_popularity, a_priori); 
    
    INSERT 
    INTO mytable (popularity, neg_popularity) 
    VALUES (@popularity, [email protected]); 
    
    SELECT * 
    FROM mytable 
    ORDER BY 
         neg_popularity, a_priori 
    
    +0

    내가 생각한 첫 번째 문제입니다. 더 좋은 해결책이 있는지 궁금 하네. – Sai

    +0

    @Sai : MySQL은 거의 없습니다. 다른 엔진에서는'(인기 DESC, a_priori)'에 인덱스를 만들 수 있지만'MySQL'에는 인덱스를 만들 수 없습니다. – Quassnoi

    +0

    또한 FWIW에서는'(neg_popularity, a_priori, common_data_1, common_data2)'에 커버 리지 인덱스를 사용해야합니다. 왜냐하면 select에 다른 필드가있을 경우 간단한 인덱스가 순서와 작동하지 않기 때문입니다. :/ – Sai

    1

    단순한 해킹 :

    이후 인기는 0 당신 1. 사이의 부동이기 때문이다 -1을 곱하면 수 있으며,이 ORDER BY popularity ASC, a_priori ASC

    로 인기의 정렬 순서를 반대로 할 수

    이 방법

    0 -1 사이의 숫자가 될 것입니다

    오버 헤드 출력이 이득인지 여부를 확신하지 못합니다.

    이것은 이메일을 역 형식으로 저장하는 해킹을 상기시켜줍니다.

    +0

    이것은 Quassnoi 's와 동일하므로 누군가에게 더 나은 솔루션이 제공되지 않는다면 그에게 먼저 수표를 줄 것입니다. 전자 메일을 역순으로 저장하는 방법은 무엇입니까? 나는 그것을 모른다. – Sai

    관련 문제