2011-09-18 2 views
1

그래서 모든 사용자와 그 값을 가진 테이블이 있습니다. 그리고 나는 그들이 얼마나 많은 "돈"을 버린 후에 주문하고 싶습니다. 문제는 users.money와 users.bank라는 두 개의 별도 필드에 돈이 있다는 것입니다.두 필드로 정렬 - 인덱싱

그래서이 내 테이블 구조입니다 :

CREATE TABLE IF NOT EXISTS `users` (
    `id` int(4) unsigned NOT NULL AUTO_INCREMENT, 
    `username` varchar(54) COLLATE utf8_swedish_ci NOT NULL, 
    `money` bigint(54) NOT NULL DEFAULT '10000', 
    `bank` bigint(54) NOT NULL DEFAULT '10000', 
    PRIMARY KEY (`id`), 
    KEY `users_all_money` (`money`,`bank`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_swedish_ci AUTO_INCREMENT=100 ; 

그리고 이것은 쿼리입니다 :

SELECT id, (money+bank) AS total FROM users FORCE INDEX (users_all_money) ORDER BY total DESC 

잘 작동하지만 내가 EXPLAIN 실행할 때 그것은 "filesort 사용"을 보여주고, 내가 ' 그것을 최적화 할 수있는 방법이 있는지 궁금합니다.

답변

1

파생 값 (각 행에 대해 계산해야하는 값)으로 정렬하기 때문에 MySQL은 인덱스를 사용하여 순서를 지정할 수 없습니다.

내가 볼 수있는 유일한 해결책은 total_money 또는 유사한 열을 만들고 money 또는 bank 값을 업데이트하는 것입니다. 응용 프로그램 코드에서이 작업을 수행 할 수도 있고, 원하는 경우 트리거를 사용하여 MySQL에서이 작업을 수행 할 수도 있습니다.

관련 문제