2010-11-18 106 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