我有一个查询从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 –