當前的實現是一個包含多個連接和臨時表的複雜查詢,但是對我的MySQL造成了太多的壓力,並且需要超過30多秒才能加載桌子。數據由PHP通過JavaScript Ajax調用檢索並顯示在網頁上。以下是涉及的表格:在分頁表中顯示大量數據而不會嚴重影響數據庫
Table: table_companies
Columns: company_id, ...
Table: table_manufacture_line
Columns: line_id, line_name, ...
Table: table_product_stereo
Columns: product_id, line_id, company_id, assembly_datetime, serial_number, ...
Table: table_product_television
Columns: product_id, line_id, company_id, assembly_datetime, serial_number, warranty_expiry, ...
單個公司可以在兩個產品表之間拆分100k個項目。產品表使用line_name進行聯合和過濾,然後按assembly_datetime進行排序,並根據分頁進行限制。日期時間值也依賴於時區,並將其作爲查詢的一部分(另一個JOIN +臨時表)應用。 line_name也是返回的列之一。
我正在考慮從產品聯合查詢拆分line_name過濾器。基本上我會確定對應於過濾器的行的ID,然後使用WHERE條件WHERE line_id IN (<results from previous query>)
進行UNION查詢。這將會削減對連接和臨時表的需求,並且我可以將line_name應用於line_id和PHP中的時區修改,但我不確定這是處理事情的最佳方式。
我也研究過使用Redis的可能性,但大量的單個產品在通過PHP(20-30秒)將所有數據推送到Redis時導致類似的漫長等待時間,即使它只是直接從產品表中拉入。
- 是否可以調整現有的查詢來提高效率?
- 我可以推動一些處理到PHP來減少SQL服務器上的負載嗎? Redis呢?
- 有沒有辦法更好地構建表格?
- 您會建議哪些其他解決方案?
我很感激您可以提供的任何輸入。
編輯:
現有的查詢:
SELECT line_name,CONVERT_TZ(datetime,'UTC',timezone) datetime,... FROM (SELECT line_name,datetime,... FROM ((SELECT line_id,assembly_datetime datetime,... FROM table_product_stereos WHERE company_id=#) UNION (SELECT line_id,assembly_datetime datetime,... FROM table_product_televisions WHERE company_id=#)) AS union_products INNER JOIN table_manufacture_line USING (line_id)) AS products INNER JOIN (SELECT timezone FROM table_companies WHERE company_id=#) AS tz ORDER BY datetime DESC LIMIT 0,100
這被格式化了一些可讀性。
SELECT line_name,CONVERT_TZ(datetime,'UTC',tz.timezone) datetime,...
FROM (SELECT line_name,datetime,...
FROM (SELECT line_id,assembly_datetime datetime,...
FROM table_product_stereos WHERE company_id=#
UNION
SELECT line_id,assembly_datetime datetime,...
FROM table_product_televisions
WHERE company_id=#
) AS union_products
INNER JOIN table_manufacture_line USING (line_id)
) AS products
INNER JOIN (SELECT timezone
FROM table_companies
WHERE company_id=#
) AS tz
ORDER BY datetime DESC LIMIT 0,100
ID被索引;主鍵是每列的第一個鍵。
請顯示您的查詢。 – 2014-10-02 21:05:53
並請提供有關主鍵和索引的信息。 – TheWolf 2014-10-02 21:09:12
我並不完全確定,但我認爲您的查詢過於複雜。你的查詢應該返回什麼?另外,您可否請格式化查詢以使其更易讀? – TheWolf 2014-10-02 21:36:28