簡體   English   中英

如何改善查詢Mysql?

[英]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

還在表vistascontrinivistacaricomagazzino 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM