我有这个查询,我需要执行的地方,我必须解析通过匹配到另一个表中的另一个字段的信息字段,然后冲洗并重复几个表,最后这会导致所需的行被返回。MySQL疯狂交叉表查询帮助!
的问题是,我怎么能加快这......它返回的行数十万,它不是在他们的管理部分的工作太多了。我的客户在查询时导致飞机坠毁。
下面是该查询:
SELECT DISTINCT t1.CU_ship_name1, t1.CU_ship_name2, t1.CU_email
FROM (
SELECT CU_id, CU_ship_name1, CU_ship_name2, CU_email
FROM customers
WHERE CU_solicit=1
AND CU_cdate >=".$startDate."
AND CU_cdate <=".$endDate."
)AS t1
INNER JOIN orders AS t2 ON t1.CU_id = t2.O_cid
INNER JOIN item AS t3 ON t2.O_ref = t3.I_oref
INNER JOIN product AS t4 ON t3.I_pid = t4.P_id
INNER JOIN (
SELECT C_id FROM category WHERE C_store_type =1
) AS t5 ON t4.P_cat = t5.C_id
的“客户”,“订单”,“项目”表得到与几十个月和每一个“产品”表数以千计的新行更新接收ATLEAST单每个月有100个新行。
我能想到唯一要做的是创建一个持有该信息(这是不是一个理想的解决方案)的新表和索引添加到这些表。我担心索引,因为这些表获得如此大量的新数据,但我愿意尝试它(总是可以撤消它的权利?)。但我不相信该指数可以自行解决问题。
更新:我现在用的这个查询并获得更快的结果,索引所有的WHERE和加入行并没有多大帮助在所有...我想不出为什么。
删除子查询:
对我的查询速度在下面的查询到151具有相同perameters一个灾难性的影响,以及从3-4秒。
SELECT DISTINCT t1.CU_ship_name1, t1.CU_ship_name2, t1.CU_email
FROM customers AS t1
WHERE t1.CU_solicit=1
AND t1.CU_cdate>= 20100725000000
AND t1.CU_cdate<= 20100801000000
AND EXISTS(
SELECT NULL FROM orders AS t2
INNER JOIN item AS t3 ON t2.O_ref = t3.I_oref
INNER JOIN product AS t4 ON t3.I_pid = t4.P_id
INNER JOIN (
SELECT C_id
FROM category
WHERE C_store_type = 2
) AS t5 ON t4.P_cat = t5.C_id
WHERE t1.CU_id = t2.O_cid);
没关系,我改变他们正常连接和无子查询和这件事情之后,一切现在快减轻。下面是该查询现在:
SELECT DISTINCT t1.CU_ship_name1, t1.CU_ship_name2, t1.CU_email
FROM customers AS t1
JOIN orders AS t2 ON t1.CU_id = t2.O_cid
JOIN item AS t3 ON t2.O_ref = t3.I_oref
JOIN product AS t4 ON t3.I_pid = t4.P_id
JOIN category AS t5 ON t4.P_cat = t5.C_id
WHERE t1.CU_solicit =1
AND t1.CU_cdate >=20100425000000
AND t1.CU_cdate <=20100801000000
AND t5.C_store_type =2
谢谢,我有索引的ON和WHERE列,但它没有任何明显的区别,任何其他建议? 此外,删除带我从6-9秒我的测试参数151秒...所以它去了完全的另一种方式,只要子查询去现在我很困惑哈哈。 – BinarySolo00100 2010-11-19 20:40:17
好的,我从侧面说明了,我可能从你在圣迭戈@SMS聘用我的工作中了解你,如果那是你,我希望你做得很好,坦纳史密斯。 – BinarySolo00100 2010-11-19 20:56:05
Woah - Tanner怎么了!你怎么了?也许我们应该把这个聊天带到FB或者电子邮件:)修复的胜利组合是什么? – 2010-11-20 07:06:27