1

我是 sql 查询的新手,并试图尽可能多地了解它们。这是我现在正在调情的 SQL 查询,并对此有一些疑问。

SELECT COUNT(id) AS count 
FROM stride 
WHERE recipientId = ? 
   AND recipientView = 0 
   AND sourceUserId != recipientId
  1. 将等号放在不等之前是否会产生性能差异,反之亦然?
  2. 我在这里使用了两次 recipientId。第二次调用变量更好还是应该两次都填充变量?例如。

SELECT COUNT(id) AS count FROM stride WHERE recipientId = ? AND recipientView = 0 AND sourceUserId != ?

  1. id是主键。COUNT(*)代替它对性能有什么影响吗?我觉得这样做COUNT(id)会更快,但这只是一种感觉,我没有证据。
  2. 我应该IN在这里使用或任何其他运算符来获得查询速度吗?
  3. 你会在这里做些什么来使这个查询更快吗?
4

2 回答 2

4

查询优化与查询的语法关系不大,而与 RDMS 查询优化器有很大关系。

您建议的所有内容可能都不会产生任何影响,因为优化器会将它们分开并构建它认为最好的查询。具体来说,

  1. 没关系
  2. 没关系
  3. 没有性能影响,但请注意,COUNT(id)<>COUNT(*)如果 id 列中有NULLs - 对于主键,则不会有任何NULLs。
  4. 我看不出您如何使用 an 构建此查询,IN但无论如何它都不会影响性能
  5. recipientId索引会显着影响速度 - 对于此查询,索引 onrecipientView并将sourceUserId产生显着影响

你应该做的就是不要相信我的话。设置每个查询并查看 RDMS 的执行计划。如果它们在那里相同,那么它们是相同的查询。

于 2013-03-04T02:07:14.403 回答
1

相等和不相等的位置无关紧要 - 除非有子查询。在您的情况下,where 子句将作为一个整体进行评估,因此不等于和等于的位置无关紧要。

Count(id) 与 Count(*) 相同,因为 [id] 是您的主键。两者都没有性能优势。

于 2013-03-04T02:18:47.707 回答