在等于之前不等于的SQL性能,反之亦然

时间:2013-03-04 01:44:06

标签: mysql sql

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

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

    1. id是主键。将COUNT(*)替换为性能方面是否有任何不同?我觉得做COUNT(id)会更快,但这只是一种感觉,我没有证据。
    2. 我应该在这里使用IN或任何其他运算符来获取查询速度吗?
    3. 你有什么办法让这个查询更快吗?

2 个答案:

答案 0 :(得分:4)

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

你建议的所有内容都可能会使 no 产生差异,因为优化器会将它们分开并构建它感觉最好的查询。具体地,

  1. 无所谓
  2. 无所谓
  3. 没有性能影响,但请注意COUNT(id)<>COUNT(*)如果id列中有NULL - 对于主键,则不会有任何NULL
  4. 我看不出如何使用IN构建此查询,但无论如何它都不会影响性能
  5. 索引会显着影响速度 - 对于此查询,recipientIdrecipientViewsourceUserId上的索引会产生巨大影响
  6. 你应该做的不是接受我的话。设置每个查询并查看RDMS中的执行计划。如果它们是相同的,则它们是相同的查询。

答案 1 :(得分:1)

除非存在子查询,否则等于和不等于的位置无关紧要。在你的情况下,where子句将作为一个整体进行评估,因此不等于和等于的位置并不重要。

Count(id)vs Count(*)是相同的,因为[id]是你的主键。无论如何都没有性能优势。