2010-11-18 62 views
0

我有这个查询,我需要执行的地方,我必须解析通过匹配到另一个表中的另一个字段的信息字段,然后冲洗并重复几个表,最后这会导致所需的行被返回。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 

回答

2

我要做两件事情:您在上使用的列

1)添加索引和WHERE子句

2)消除通过重写子查询他们作为正常的联接和WHERE条件

只有当你做了这些,发现你仍然有问题,你应该考虑其他的选择。

这的确看起来像一个非常简单的查询,比不必要的子查询等。除非你没有定义索引,MySQL可用的内存太少,或者你已经为可用资源配置了MySQL服务器本身,那么你不会期望它会变得很慢。

一个月一万个新行是什么都没有。你每隔几分钟就要进行一次新行。在决定定义哪些索引时,这甚至不是一个考虑因素。在廉价服务器上的MySQL可以处理数百个插入点每秒

1

我会指数的地方标准以及在ON语句中的列。索引将立即解决您的崩溃问题,并且可能不会显着降低您的修改操作。每个月成千上万行实际上并不是很多行 - 除非您的数据库位于弱机器上。

此外,我会考虑完全删除子查询。他们经常减慢SQL服务器的性能。您可能还需要考虑将查询移入存储过程,以便服务器有机会缓存​​其执行计划。

+0

谢谢,我有索引的ON和WHERE列,但它没有任何明显的区别,任何其他建议? 此外,删除带我从6-9秒我的测试参数151秒...所以它去了完全的另一种方式,只要子查询去现在我很困惑哈哈。 – BinarySolo00100 2010-11-19 20:40:17

+0

好的,我从侧面说明了,我可能从你在圣迭戈@SMS聘用我的工作中了解你,如果那是你,我希望你做得很好,坦纳史密斯。 – BinarySolo00100 2010-11-19 20:56:05

+0

Woah - Tanner怎么了!你怎么了?也许我们应该把这个聊天带到FB或者电子邮件:)修复的胜利组合是什么? – 2010-11-20 07:06:27