mysql查询结果顺序问题

时间:2011-07-09 17:39:41

标签: mysql query-performance

我有一个包含这些字段的表: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中的任何优雅解决方案?

3 个答案:

答案 0 :(得分:1)

birthdate,logintime上添加索引可以改善您的查询,但它有其缺点。我相信logintime(顾名思义)经常更改,因此db引擎必须更新基础索引,这反过来会导致索引碎片。
 如果您的查询足够有选择性且使用了birthdate上的索引,我看不到文件排序的大问题  此外,您可以尝试将查询放在存储过程的主体中;在这种情况下,与ad-hoc查询相比,mysql将更有效地使用缓存。

答案 1 :(得分:0)

索引必须是birtdate,longtime(首先你必须满足WHERE子句,然后是顺序),但我不确定它是否可以使用索引在条件之间进行排序。需要排序多少条记录?由于Query很受欢迎,您可以使用memcache或其他缓存机制来提供结果,而无需访问数据库

答案 2 :(得分:0)

AFAIK,在列上有索引不会影响排序,只在搜索 - 它有助于 where 子句,而不是子句订购。

编辑:关注@ Darhazer的链接 - 基本上是说“ORDER BY可以被索引满足”