所以我有一张包含所有用户及其值的表格。而且我想在他们得到多少“钱”之后订购它们。问题是他们在两个单独的领域有钱: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时它会显示“Using filesort”,我想知道是否有任何方法可以优化它?
答案 0 :(得分:1)
因为你想按派生值排序(必须为每一行计算一个),MySQL不能使用索引来帮助排序。
我能看到的唯一解决方案是创建其他total_money
或类似列,并在更新money
或bank
时更新该值。您可以在应用程序代码中执行此操作,或者如果您愿意,也可以在MySQL中使用触发器执行此操作。