我有這個查詢,我需要執行的地方,我必須解析通過匹配到另一個表中的另一個字段的信息字段,然後沖洗並重復幾個表,最後這會導致所需的行被返回。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