MySQL查询时间太长
MySQL服务器未回复,在以下查询后挂起:MySQL查询时间太长,mysql,Mysql,MySQL服务器未回复,在以下查询后挂起: SELECT i.id AS id, i.name AS product, i.stock AS stock, IF(SUM(s1.qty) IS NULL, 0, SUM(s1.qty)) AS thisqty, IF(SUM(s2.qty) IS NULL, 0, SUM(s2.qty)) AS lastqty, IF(SUM(s3.qty) IS NULL, 0, SUM(s3.qty)) AS last2qty, IF(SUM(s
SELECT
i.id AS id,
i.name AS product,
i.stock AS stock,
IF(SUM(s1.qty) IS NULL, 0, SUM(s1.qty)) AS thisqty,
IF(SUM(s2.qty) IS NULL, 0, SUM(s2.qty)) AS lastqty,
IF(SUM(s3.qty) IS NULL, 0, SUM(s3.qty)) AS last2qty,
IF(SUM(s4.qty) IS NULL, 0, SUM(s4.qty)) AS last3qty
FROM
item i,
sale s1, sale s2, sale s3, sale s4,
odr o1, odr o2, odr o3, odr o4
WHERE
i.id = s1.itemid AND s1.oui = o1.oui AND (o1.ddate BETWEEN '2016-02-08' AND '2016-02-14') AND
i.id = s2.itemid AND s2.oui = o2.oui AND (o2.ddate BETWEEN '2016-02-01' AND '2016-02-07') AND
i.id = s3.itemid AND s3.oui = o3.oui AND (o3.ddate BETWEEN '2016-01-25' AND '2016-01-31') AND
i.id = s4.itemid AND s4.oui = o4.oui AND (o4.ddate BETWEEN '2016-01-18' AND '2016-01-24') GROUP BY PRODUCT;
我的表格结构如下:
mysql> describe item;
+---------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+----------------+
| id | int(3) | NO | PRI | NULL | auto_increment |
| name | varchar(255) | NO | | NULL | |
| wprice | int(11) | NO | | NULL | |
| sprice | int(11) | NO | | NULL | |
| bprice | int(11) | NO | | NULL | |
| stock | float | NO | | NULL | |
| buyfrom | varchar(255) | NO | | NULL | |
| unit | varchar(255) | NO | | NULL | |
+---------+--------------+------+-----+---------+----------------+
8 rows in set (0.03 sec)
mysql> describe odr;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| oui | varchar(32) | YES | | NULL | |
| odate | varchar(16) | YES | | NULL | |
| ddate | varchar(16) | YES | | NULL | |
| otime | varchar(16) | YES | | NULL | |
| cid | varchar(6) | YES | | NULL | |
| disc | int(11) | YES | | NULL | |
| total | int(11) | YES | | NULL | |
| net | int(11) | YES | | NULL | |
| status | char(1) | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
9 rows in set (0.02 sec)
mysql> describe sale;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| oui | varchar(32) | YES | | NULL | |
| itemid | varchar(3) | YES | | NULL | |
| qty | float | YES | | NULL | |
| price | int(11) | YES | | NULL | |
| amount | int(11) | YES | | NULL | |
| profit | float | NO | | NULL | |
+--------+-------------+------+-----+---------+-------+
6 rows in set (0.03 sec)
我试着用s1进行查询,结果成功了。where子句中的AND可能太多。
我还尝试了phpmyadmin,但仍然没有工作更改查询以过滤子查询中的数据 试试这个:
SELECT
i.id AS id,
i.name AS product,
i.stock AS stock,
IF(SUM(s1.qty) IS NULL, 0, SUM(s1.qty)) AS thisqty,
IF(SUM(s2.qty) IS NULL, 0, SUM(s2.qty)) AS lastqty,
IF(SUM(s3.qty) IS NULL, 0, SUM(s3.qty)) AS last2qty,
IF(SUM(s4.qty) IS NULL, 0, SUM(s4.qty)) AS last3qty
FROM item i
inner join (select sale.* from sale
inner join odr on sale.oui=odr.oui
where odr.ddate BETWEEN '2016-02-08' AND '2016-02-14'
) s1 on i.id = s1.itemid
inner join (select sale.* from sale
inner join odr on sale.oui=odr.oui
where odr.ddate BETWEEN '2016-02-01' AND '2016-02-07'
) s2 on i.id = s2.itemid
inner join (select sale.* from sale
inner join odr on sale.oui=odr.oui
where odr.ddate BETWEEN '2016-01-25' AND '2016-01-31'
) s3 on i.id = s3.itemid
inner join (select sale.* from sale
inner join odr on sale.oui=odr.oui
where odr.ddate BETWEEN '2016-01-18' AND '2016-01-24'
) s4 on i.id = s4.itemid
GROUP BY PRODUCT;
你有关于
itemid
、oui
和ddate
的索引吗?没有,这会是个问题吗?这是最大的问题。为字段创建一个复合索引,并为您的字段显示解释query@ThomasMoe:创建列索引以提高查询性能,您是否尝试过我刚才回答的查询?我尝试过您的解决方案,但出现了以下错误:#1060-重复列名'oui'我在选项卡中添加了索引您之所以出现此错误是因为我正在从子查询中的sale
和odr
中选择oui
列。无论如何,检查更新的答案。