开发者

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 se开发者_JAVA技巧perate 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?


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.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜