我有一個看起來像這樣的表...MYSQL:兩項計數,一組......更好的方法?
*------------------------------------*
| id | state | name | status |
|------|---------|--------|----------|
| 1 | AZ | Tim | OK |
| 2 | AZ | Jon | BAD |
| 3 | NV | Bob | BAD |
| 4 | NV | Ted | OK |
| 5 | NV | Don | BAD |
| 6 | CO | Guy | OK |
| 7 | CO | Jed | OK |
| 8 | CA | Cal | BAD |
| 9 | CA | Tom | OK |
| 10 | CA | Ian | OK |
*------------------------------------*
我需要產生一個結果,看起來像這樣...
*--------------------------------*
| state | total | totalgood |
|---------|--------|-------------|
| AZ | 2 | 1 |
| NV | 3 | 1 |
| CO | 2 | 2 |
| CA | 3 | 2 |
*--------------------------------*
我能做到這樣的...
SELECT state AS state,
COUNT(*) AS total,
SUM(CASE WHEN status = 'OK' THEN 1 ELSE 0 END) AS totalgood
FROM mytable
WHERE state IN ('AZ','NV','CO','CA')
GROUP BY state;
我的問題是,這是一個非常大的表超過100K記錄。我的理解是,使用SUM會導致它循環遍歷每一行。這可能是一個非常大的表現。
那麼有沒有更好的方法來做到這一點?或者......我的擔心是沒有根據的?我認識到,我對MySQL並不熟悉,而且我很難在JOIN中找到自己的想法。所以,任何建議表示讚賞。
(*注意WHERE子句,而在這裏沒有必要的,將是我真正的應用程序。)
我知道100K是不是一噸,但我這運行在硬件上等於小於大多數手機,與其他進程運行。所以我可以做的任何事情來擠出更多的表現是好的;-) 因此CASE語句上的COUNT與SUM沒有相同的性能命中?在這種情況下,它幾乎看起來是一樣的。 –
@ AZ-T我不知道,我還沒有用過很多的mysql,我主要工作在Oracle數據庫上。如果你有一個合適的索引(包含狀態和狀態),它應該仍然相當快。 –