【发布时间】:2015-07-01 19:11:12
【问题描述】:
假设我有一个包含 a、b 和 c 列的大型数据库。假设我希望根据多列上的某些排序选择第 x 到第 (x+100) 行。我可以使用ORDER BY 和LIMIT 构造来完成此操作:
SELECT * FROM table_name ORDER BY b ASC, c DESC, a DESC LIMIT x, 100
如果我希望使用相同的顺序(在 b 上升序,在 c 上降序,然后在 a 上降序)但具有不同的范围限制,该怎么办?直观地说,不需要为每个这样的查询重复昂贵的排序操作。
我正在研究使用索引 (http://dev.mysql.com/doc/refman/5.6/en/order-by-optimization.html) 优化 ORDER BY 操作,但不幸的是,似乎无法创建包含混合升序和降序的索引。
有没有好的方法来优化这个?这似乎是一个相当常见的用例。
【问题讨论】:
-
仅供参考,语法是
LIMIT x, 100——它是LIMIT start, count,而不是LIMIT start, end。 -
@Barmar 不错。谢谢!
-
b列是唯一与其他列具有不同方向的列吗?如果是,那么b列是否是数字? -
b和c的数据类型是什么?我们能得到它们语义的线索吗? (日期、排名、用户名……) -
@s3v3n 对于我的实际应用程序,有时我会有不止三列,并且会任意分配升序和降序。
标签: mysql sorting optimization indexing sql-order-by