2014-05-08 57 views
0

正如標題所述,我試圖計算某個表中最後100條記錄內的匹配數。在前100行中計數匹配

該查詢有效,但數據非常動態,在該特定表上有大量插入,並且類似的查詢正在運行,並且它們最終都會非常緩慢(20s),可能會彼此阻塞。

因爲緩存結果是不可接受的(數據必須是實時的)我正在考慮將外部查詢切換到PHP,即使我知道這會比較慢,因爲它仍然會比20秒更快。

這裏的查詢

SELECT count(*) as matches 
FROM (
    SELECT first_name FROM customers 
    WHERE division = 'some_division' 
    AND type = 'employee' 
    ORDER BY request_time DESC 
    LIMIT 0, 100 
) as entries 
WHERE first_name = 'some_first_name_here' 

我在找什麼執行相同的任務更優化的方式,而無需實現在PHP因爲這是天真/顯然是錯誤的做法。

表看起來是這樣的:

id first_name last_name type division request_time 

只是爲了把事情,這顯然是不實際的表/數據由於NDA的原因,但是,該表看上去完全不同的列名相同。

所以,我試圖實現的是拉取在最近的100條記錄中發現的匹配數,這些記錄有一些限制。

例如,

how many times does the name 'John' appear within the last 100 employees added in the HR division? 
+0

擺脫包裝的,並補充說,最後的WHERE條件給了別人。返回的行數會告訴你計數。我認爲,關於(division,type,first_name)的複合索引也有幫助。 – Strawberry

+0

在內部查詢中,您只選擇'user_id',但是然後在不同的列('first_name')上過濾結果。這真的有可能嗎?!你確定這個查詢工作嗎?另外,你能寫出表格的模式嗎? – winterlude

+0

@Strawberry只會在整個表格中給我計數,而我在最後的100個條目中需要它。然而,一個複合指數是一個很好的建議,它可能會改善整個事情。 – Carvefx

回答

0

我明白了。

如何這樣的事情...

SELECT i 
    FROM 
     (SELECT CASE WHEN first_name = 'some_first_name_here' THEN @i:[email protected]+1 END i 
      FROM customers 
     WHERE division = 'some_division' 
      AND type = 'employee' 
      , (SELECT @i:=0)val 
     ORDER 
      BY request_time 
      DESC   
     LIMIT 0,100 
    ) n 
    ORDER 
    BY i DESC 
    LIMIT 1; 
0

試試這個:

SELECT SUM(matches) 
FROM 
(
    SELECT IF(first_name = 'some_first_name_here', 1, 0) AS matches 
    FROM customers 
    WHERE division = 'some_division' AND type = 'employee' 
    ORDER BY request_time DESC 
    LIMIT 0,100 
) AS entries