SQL-条件的顺序重要吗?

SQL-条件的顺序重要吗?,sql,Sql,假设category\u id是表books的索引键(不是主键)。以下两个SQL语句之间有什么区别吗 SELECT * FROM books WHERE author='Bill' AND category_id=1 SELECT * FROM books WHERE category_id=1 AND author='Bill' 我猜先按category\u id过滤记录,然后按author过滤记录要比按相反顺序过滤记录快。SQL引擎是否足够聪明,可以这样做?简言之,不,它们无关紧要,因为

假设
category\u id
是表
books
的索引键(不是主键)。以下两个SQL语句之间有什么区别吗

SELECT * FROM books WHERE author='Bill' AND category_id=1

SELECT * FROM books WHERE category_id=1 AND author='Bill'

我猜先按
category\u id
过滤记录,然后按
author
过滤记录要比按相反顺序过滤记录快。SQL引擎是否足够聪明,可以这样做?

简言之,不,它们无关紧要,因为优化器将确定获取数据的最佳方法。

不,WHERE子句的顺序无关紧要

优化器检查查询并根据索引等确定获取数据的最佳方法。即使在category_id和author列上有一个覆盖索引,这两个列都可以满足使用它的标准(假设没有更好的)


在您的示例中,您已经告诉引擎/优化器您想要什么。。。现在,它将找到实现这一点的最佳方法(在合理的范围内,并且“成本”是离题的)。

而一般来说,不,这假设您使用的是现代数据库。也许在十年前,它当然很重要。

是的,SQL是一种声明性语言。但是在SQL Server中(不确定其他引擎),DBA实际上可以(有点)通过在SQL查询存储中强制执行执行计划来做到这一点

但是,是的,你不能从你的应用程序中控制它,也不能从查询文本本身中控制它


另外2美分:您可以通过使用
强制顺序

来控制连接的顺序,尽管我同意我要补充的一点是,我会命令您的逻辑在使用or语句时立即通过,或者在使用and语句时可能会立即失败。如果可以立即找到,则无需检查其他条件。非最新的统计信息是否会影响这一点?@Abe Miessler:是的,统计信息和索引过期会对优化器的选择产生负面影响。但是数据越多,更新这些数据的成本就越高。MySQL也是这样吗?@Andreweath:据我所知,这适用于我在发布之前搜索过的数据库(不包括NoSQL变体)。有人知道如何编辑这篇文章,以便以后当别人有同样的问题时更容易被搜索吗?@OMG_uremusrusanu最近在一个问题上发布了这个链接。也许就是这样@马丁·史密斯:不知道雷姆斯有博客,很酷。找到博客链接发布位置的链接了吗?@OMG-Yep。就在这里。。。true语句可能与+1重复。也就是说,Prolog是声明性的,但是(至少在我使用的实现中)条件的顺序很重要。似乎Oracle基于规则的优化器(RBO)在开发执行计划时会查看where子句中谓词的顺序。+1表示较旧的RDBMS系统可能没有此功能。