我有一個查詢從product
表(第一選擇)獲取產品說明,然後將其減去以下子查詢語句以獲得no。剩餘庫存的:使用多個連接優化SQL查詢。需要關於技術快速有效地檢索數據的建議
每個產品的-sum 股在inventory
表(第二)
每個產品的-sum在sales_detail
表(第三)
每個-sum出售產品轉移到另一個分支在stock_transfer
表(第4)
-每個產品的總和損壞在damaged_product
表(第5個)
問題是每次查詢加載時,它會全部搜索所有4個表以獲得quantity
列的總和。隨着時間的推移,更多的記錄被存儲,查詢將變得更慢。有什麼建議麼?
SELECT p.Id,p.Product_Name Product,p.Description, c.Category_Name Category,sc.Subcategory_Name Subcategory,s.Supplier_Name Supplier, p.Selling_Price `Unit Price`,i.Stocks,s.Sales, i.Stocks - IFNULL(s.Sales, 0) - IFNULL(t.Transfer, 0) - IFNULL(d.Damage, 0) AS Remaining
FROM (SELECT Id, Product_Name, Description, Selling_Price, Category_Id, Subcategory_Id, Supplier_Id FROM product WHERE enable_flag = 1) p
LEFT OUTER JOIN(SELECT product_id, COALESCE(SUM(quantity), 0) AS Stocks
FROM inventory
WHERE enable_flag = 1 GROUP BY product_id) i ON p.Id = i.product_id
LEFT OUTER JOIN(SELECT product_id, COALESCE(SUM(quantity), 0) AS Sales
FROM sales_detail
WHERE enable_flag = 1 GROUP BY product_id) s USING(product_id)
LEFT OUTER JOIN(SELECT product_id, COALESCE(SUM(transfer_quantity), 0) AS Transfer
FROM stock_transfer
WHERE enable_flag = 1 GROUP BY product_id) t USING(product_id)
LEFT OUTER JOIN(SELECT product_id, COALESCE(SUM(damaged_quantity), 0) AS Damage
FROM damaged_product
WHERE enable_flag = 1 GROUP BY product_id) d USING(product_id)
JOIN Category c ON p.Category_Id=c.Id
JOIN Subcategory sc ON p.Subcategory_Id=sc.Id
JOIN Supplier s ON p.Supplier_Id=s.Id;
索引列有很大的影響關於查詢性能。 是否在涉及查詢的所有表中索引了內部和外部鍵? –
我相信MySql中的主鍵在創建時會自動建立索引,對於外鍵也一樣。我需要檢查'JOIN'子句中的所有'WHERE'語句是否都被索引。由於 –
我指的是類似在這個例子中爲user_id,沒有索引的外鍵列: CREATE TABLE MyGuests( \t ID INT(6)UNSIGNED AUTO_INCREMENT PRIMARY KEY, \t USER_ID INT NOT NULL, \t姓VARCHAR( 30)NOT NULL, \t姓氏VARCHAR(30)NOT NULL, \t電子郵件VARCHAR(50), \t reg_date TIMESTAMP ) 此外,這裏是一個類似的帖子,可能會給你一個提示。 http://stackoverflow.com/questions/9330204/optimizing-mysql-query-with-sum-date-range-and-group-by –