[英]MySQL multiple Date subqueries
我正在為一個非常具體的報告編寫查詢,該報告包含基於項目的特定關系的可變列數。 我願意就如何更改查詢提出建議,但我認為不可能。 我寧願將其保留為單個查詢,而不是循環運行。 正在搜索的表包含大約400萬條記錄,無法存檔。
我想知道的是,為什么在子查詢中不使用DATEADD索引,盡管在同一表的外部查詢中使用了DATEADD索引。 我知道字段上的函數使MySQL無法建立索引,但這僅在項目上,而不是您要與之進行比較的項目。
報告的結果是該范圍內發生日期的每個日期的每個特定項目(子查詢)的數字。 日期范圍是動態生成的。 子查詢應返回一天的結果
我們正在使用MySQL 5.0.77版本,由於它是由托管服務提供商管理的,因此無法更改。
這是查詢:
SELECT DATE_FORMAT(DATEADD, '%d/%m/%y') AS DATEADD,
(SELECT COUNT(ID)
FROM ATABLE AS
WHERE ELEMNAME = 'ANELEMENT' AND COMPID = 132
AND VT.DATEADD BETWEEN CONCAT(DATE(V.DATEADD)," 00:00:00") AND CONCAT(DATE(V.DATEADD)," 23:59:59")))
AS '132',
(SELECT COUNT(ID)
FROM ATABLE AS
WHERE ELEMNAME = 'ANELEMENT' AND COMPID = 149
AND VT.DATEADD BETWEEN CONCAT(DATE(V.DATEADD)," 00:00:00") AND CONCAT(DATE(V.DATEADD)," 23:59:59")))
AS '149'
FROM ATABLE AS V
WHERE 1 = 1 AND COMPID = 132
AND (V.DATEADD >= "2010-09-01 00:00:00"
AND V.DATEADD <= "2010-10-26 23:59:59")
AND 1 = 1
AND ELEMNAME = 'ANELEMENT'
GROUP BY DATE_FORMAT(DATEADD, '%Y-%m-%d')
子查詢的運行次數取決於該項目所具有的鏈接數,並在構建查詢時確定。
我們已經嘗試過:用
"VT.DATEADD <= DATE(V.DATEADD) and VT.DATEADD <= DATE(V.DATEADD) +1"
但是,這也不起作用,將其更改為
"VT.DATEADD = DATE(V.DATEADD)"
確實使用了索引,但是沒有返回正確的行數,因為DATEADD是日期時間。 如果我們將其更改為:
"VT.DATEADD >= "2010-09-01" AND VT.DATEADD <= "2010-09-02"
Explain的輸出是
+----+--------------------+-------+-------+-------------------------+----------+---------+-------+-------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+--------------------+-------+-------+-------------------------+----------+---------+-------+-------+----------------------------------------------+
| 1 | PRIMARY | V | range | DATEADD,COMPID,ELEMNAME | DATEADD | 8 | NULL | 1386 | Using where; Using temporary; Using filesort |
| 2 | DEPENDENT SUBQUERY | VT | ref | COMPID,ELEMNAME | ELEMNAME | 103 | const | 44277 | Using where |
+----+--------------------+-------+-------+-------------------------+----------+---------+-------+-------+----------------------------------------------+
使用USE INDEX或FORCE INDEX(在可用但未使用時)使用NULL鍵
在不解決此問題的情況下,即使在很小的日期范圍內,查詢的運行速度也非常慢,並且將數據庫鎖定。
我不知道我是否過度簡化了總體需求,但是這一點對您有用。 您似乎想知道在給定日期范圍內兩個“ compli”值的活動量。
SELECT
DATE_FORMAT(DATEADD, '%Y-%m-%d'),
SUM( if( compid = 132, 1, 0 ) ) as Count132,
SUM( if( compid = 149, 1, 0 ) ) as Count149
from
ATable
where
elemname = "ANELEMENT"
AND ( compid = 132 or compid = 149 )
AND DATEADD BETWEEN "2010-09-01 00:00:00" AND "2010-10-26 23:59:59"
group by
dateadd
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.