我有一个包含这些字段的表:userid,logintime,birthdate
我需要让所有用户在生日X和Y之间获得最先登录的所有用户。
SELECT *
FROM table
WHERE birtdate BETWEEN x AND Y
ORDER BY logintime DESC
如果我在birtdate上定义一个索引,mysql会使用filesort来排序我想避免的结果(表越来越大,查询很受欢迎)。
定义一个索引(logintime,birthdate)对我来说没有意义,因为logintime甚至不在WHERE子句中(我只是限制了birthdate的结果集)
mysql中的任何优雅解决方案?
答案 0 :(得分:1)
在birthdate,logintime
上添加索引可以改善您的查询,但它有其缺点。我相信logintime
(顾名思义)经常更改,因此db引擎必须更新基础索引,这反过来会导致索引碎片。
如果您的查询足够有选择性且使用了birthdate
上的索引,我看不到文件排序的大问题
此外,您可以尝试将查询放在存储过程的主体中;在这种情况下,与ad-hoc查询相比,mysql将更有效地使用缓存。
答案 1 :(得分:0)
索引必须是birtdate,longtime(首先你必须满足WHERE子句,然后是顺序),但我不确定它是否可以使用索引在条件之间进行排序。需要排序多少条记录?由于Query很受欢迎,您可以使用memcache或其他缓存机制来提供结果,而无需访问数据库
答案 2 :(得分:0)
AFAIK,在列上有索引不会影响排序,只在搜索 - 它有助于 where 子句,而不是按子句订购。
编辑:关注@ Darhazer的链接 - 基本上是说“ORDER BY可以被索引满足”