[英]How to improve query Mysql?
我在MySql中進行了此查詢。 找到了,但查詢時間為3或+分鍾。
我想知道是否有可能改善此查詢。
查詢是這樣的:
SELECT CODARTIOLO, NOMEARTICOLO, SUM(QUANTITA) AS QUANTITA,
(SUM(TOTRIGA)/SUM(QUANTITA)) AS TOTALE,
(SELECT (SUM(QUANTITA * PREZZOCAD))/SUM(QUANTITA)
FROM vistacaricomagazzino cm
WHERE cm.DATA <= '$dataStart' AND cm.codarticolo=CODARTIOLO) AS PREZZOMEDIO
FROM vistascontrini c
WHERE c.DATA >= '$dataStart' AND c.DATA <= '$dataEnd'
GROUP BY NOMEARTICOLO
該表是:
VISTASCONTRINI
+--------------+--------------+------+-----+------------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+--------------+------+-----+------------+-------+
| CODARTIOLO | varchar(13) | YES | | NULL | |
| NOMEARTICOLO | varchar(60) | YES | | NULL | |
| QUANTITA | int(11) | YES | | NULL | |
| TOTRIGA | decimal(9,2) | YES | | NULL | |
| DATA | date | NO | | 0000-00-00 | |
VISTACARICOMAGAZZINO
+-------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------------+------+-----+---------+-------+
| codordine | int(11) | NO | | 0 | |
| Quantita | int(11) | YES | | NULL | |
| PrezzoCad | decimal(10,3) | YES | | NULL | |
| codArticolo | varchar(13) | YES | | NULL | |
| Data | date | YES | | NULL | |
+-------------+---------------+------+-----+---------+-------+
如果您的表沒有索引(看起來不像索引一樣),那么這是您需要修復的第一件事。 如果您這樣做正確(即將索引放在需要建立索引的字段上),則可能一擊即可為您解決問題。
您需要考慮建立索引的字段是WHERE和GROUP BY子句使用的字段。
接下來,考慮將其從嵌套的SELECT查詢轉換為JOIN查詢。 這也可能會給您帶來更好的性能。
最后,您沒有在這里說明要整理多少數據,但是如果數據量很大,則可以考慮將整理后的數據總數單獨存儲在數據庫中,這樣您就可以直接查詢它,而不必重新查詢每次都生成所有這些總和和組。 這顯然有其自身的考慮因素(附加存儲,在更新數據以更新總數時還需要附加代碼,發生不同步的可能性等),但是如果您確實為此感到痛苦,那么這是一個有效的解決方案。
我認為您可以嘗試從select
子句中刪除子查詢。 將查詢修改為類似(未經測試,僅是為了弄清主意) ,
SELECT c.CODARTIOLO,c.NOMEARTICOLO,SUM(c.QUANTITA) AS QUANTITA,(SUM(c.TOTRIGA)/SUM(c.QUANTITA)) AS TOTALE,(SUM(cm.QUANTITA * cm.PREZZOCAD))/SUM(cm.QUANTITA)
FROM vistascontrini c,
vistacaricomagazzino cm
WHERE cm.codarticolo=c.CODARTIOLO
AND cm.DATA <= '$dataStart'
AND c.DATA >= '$dataStart' AND c.DATA <= '$dataEnd' group by NOMEARTICOLO
還在表vistascontrini
和vistacaricomagazzino
DATA
列上添加索引。
在vistascontrini.DATA, vistascontrini.NOMEARTICOLO, vistacaricomagazzino.DATA, vistacaricomagazzino.codarticolo
上添加索引
不清楚您是否CODARTIOLO
分組,如果僅按NOMEARTICOLO
分組, NOMEARTICOLO
需要什么價值?
嘗試使用與您的查詢等效的以下查詢:
SELECT T.*,T1.PREZZOMEDIO FROM
(
SELECT CODARTIOLO,NOMEARTICOLO,
SUM(QUANTITA) AS QUANTITA,
(SUM(TOTRIGA)/SUM(QUANTITA)) AS TOTALE,
FROM vistascontrini c
WHERE c.DATA >= '$dataStart' AND c.DATA <= '$dataEnd'
group by NOMEARTICOLO
) AS T
LEFT JOIN
( SELECT CODARTIOLO,(SUM(QUANTITA * PREZZOCAD))/SUM(QUANTITA) as PREZZOMEDIO
FROM vistacaricomagazzino cm
WHERE cm.DATA <= '$dataStart'
GROUP BY CODARTIOLO ) as T1
ON T.CODARTIOLO=T1.CODARTIOLO
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.