TWEAK更好/更糟糕的查询性能的“按订单”

想象一下,如果查询用于检索书籍的列表为您的网站。

选择ID,从书本date_published命令由date_published递减

如果碰巧是多本书籍以完全相同的date_published它们的顺序是明确规定。他们往往会以相同的顺序来对数据库的了,但运行使用多个查询码偏移和限制翻阅这些行可能会看到同一本书不止一次由于排在查询之间不同的顺序来对数据库的出。

没问题,只要通过ID顺序了。这样,各行均保证以相同的顺序来的数据库了。结果集是99.9%,排序第一order by子句所以第二个应该不会影响性能的多。

选择ID,从书本date_published命令由date_published递减,ID

突然,查询执行时间的推移,从3毫秒至300毫秒。刚才发生了什么?为什么by子句二阶过这样大规模的演出效果?

两者都做date_published和id有索引?是。

如果你看一下解释输出为两个查询一个关键的区别是明显的。by子句包含单个订单的查询没有排序步骤。该行进来恰好你要求的顺序,以便不需要进行排序匹配索引顺序的数据库了。当你然后说“排序这个,现在这个其他东西那种”依靠索引的顺序是远远不够的。显式排序现在需要以及需要​​时间。

如何解决

1)在你的两列添加复合索引。具有两列分别索引是不够的。您需要一个包括两列作为一对的指数。

2)检查您的订单在您所请求的索引顺序排同一方向的指标即是排序。您可以轻松地通过尝试既是递增和递减顺序,使一个音符的查询执行时间检查。ASC和DESC之间翻转将有可能导致你的查询执行时间超快速和慢速灾难性之间翻转。机会是你想要的下面。

选择ID,通过date_published递减从书本为了date_published,ID降序

如果你的查询执行时间从3毫秒至300毫秒就你现在应该可以看到它下降回落到3毫秒〜不过你现在即使有重复date_published值保证行顺序。如果你没有得到这两个步骤正确,则查询执行时间将根本不下来。