我在 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 查询。这也可能会给你带来更好的性能。
最后,您还没有说明这里要整理多少数据,但如果数据量很大,那么请考虑将整理后的数据总数单独存储在数据库中,以便您可以直接查询,而不是通过每次都重新生成所有这些总和和组。这显然有它自己的考虑因素(额外的存储、更新数据时的额外代码也更新总数、事情不同步的可能性等),但如果你真的在这方面遇到性能问题,那么这是一个有效的解决方案。
关于mysql - 如何提高Mysql的查询能力?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22560085/