Dennefyren
Dennefyren

Reputation: 344

Order by two fields - Indexing

So I've got a table with all users, and their values. And I want to order them after how much "money" they got. The problem is that they have money in two seperate fields: users.money and users.bank.

So this is my table structure:

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 ;

And this is the query:

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

Which works fine, but when I run EXPLAIN it shows "Using filesort", and I'm wondering if there is any way to optimize it?

Upvotes: 1

Views: 217

Answers (1)

James C
James C

Reputation: 14149

Because you want to sort by a derived value (one that must be calculated for each row) MySQL can't use the index to help with the ordering.

The only solution that I can see would be to create an additional total_money or similar column and as you update money or bank update that value too. You could do this in your application code or it would be possible to do this in MySQL with triggers too if you wanted.

Upvotes: 1

Related Questions