2013-03-04 183 views
1

我是新來的sql查詢,並試圖儘可能多地學習他們。這裏是我正在調情與現在的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

查詢優化與您的查詢的語法很少有關,並且與RDMS查詢優化器有很大關係。

所有你建議的事情可能會使沒有不同,因爲優化器會將它們拉開,並建立它感覺最好的查詢。具體來說,

  1. 不要緊
  2. 不要緊
  3. 性能沒有影響,但請注意,如果COUNT(id)<>COUNT(*)NULL S IN的id列 - 一個主鍵不會有任何NULL秒。
  4. 我看不出你如何能建立這樣的查詢與IN,但在任何情況下也不會影響性能
  5. 指數影響顯着的速度 - 在recipientIdrecipientViewsourceUserId此查詢,指數將有顯着的影響

你應該做的是不要讓我的話。設置每個查詢並查看RDMS的執行計劃。如果它們在那裏相同,那麼它們是相同的查詢。

+0

如何在phpMyAdmin中談論最後一點?我如何測試這些查詢? – gmustudent 2013-03-04 06:04:35

+0

閱讀文檔 - 我的經驗是與SQL Server – 2013-03-04 22:26:11

1

它不會在等於和不等於的位置 - 除非有子查詢。在你的情況下,where子句將作爲一個整體進行評估,所以不等於不等於和不等於的地方。

由於[id]是您的主鍵,Count(id)與Count(*)是相同的。這兩種方法都沒有性能優勢。

+0

感謝您的信息 – gmustudent 2013-03-04 06:05:09