2014-09-03 57 views
0

我有五个表join。该查询需要超过5秒的时间才能执行。我有如下所示的四个查询,所以我的PHP页面需要超过30秒才能加载。我需要提高性能。你可以帮我吗?我奋斗了一个星期。我添加了索引。如何优化mysql查询性能

我的查询

SELECT f.SortField , f.id 
FROM tbl_store_brands AS sb 
INNER JOIN tbl_products AS p 
    ON sb.categoryID = p.pkCategory AND sb.brandID = p.pkBrand 
INNER JOIN ModelPrice AS mp ON (p.id = mp.product_id) 
INNER JOIN Brand_Data AS bd ON bd.pkID = p.pkBrand+0 
INNER JOIN tbl_filters AS f 
    ON (
     p.pkID = f.pkID and 
     p.pkCategory = f.Category AND 
     p.cgSlug = 'bathroom-fixtures' 
    ) 
WHERE mp.Available = 1 
GROUP BY f.SortField 
ORDER BY if (
    f.SortField = 'CAPACITY' OR 
    f.SortField = 'WIDTH' OR 
    f.SortField = 'HEIGHT' OR 
    f.SortField = 'DEPTH', 4, f.ValueDisplayOrder 
) ASC 

我的查询说明 enter image description here

+0

你不只是*“添加索引” *神奇地解决问题。您需要在适当的地方添加特定的索引。你有什么指数?我要做的第一件事是失去'ORDER BY'子句。另外,为什么“GROUP BY”没有任何聚合? – Phil 2014-09-03 09:19:18

+0

您可以使用PHP ORM,非常容易使用。如果你想做一些像'INNER JOIN'或其他的东西,只需要像这样调用你的模型(例子)。 'TblStoreBrands :: with('TblProduct') - > get();' – 2014-09-03 09:32:39

+1

@ArryanggaAlievPratamaputra这有什么关系? – Cylindric 2014-09-03 09:51:03

回答

0

很少的修改都可以做,以提高你的查询性能。 1.为ValueDisplayOrder添加索引,这将改善排序性能。 2.避免查询每个功能。删除“p.pkBrand + 0”,这会增加执行处理时间。如果可能的话,从命令中移除if子句,然后在PHP代码中进行排序。 3.将“p.cgSlug ='bathroom-fixtures'”代码移至产品表连接的on子句以缩小内部连接结果。

你修改后的查询会是这样的:

SELECT f.SortField , f.id 
FROM tbl_store_brands AS sb 
INNER JOIN tbl_products AS p 
    ON sb.categoryID = p.pkCategory AND sb.brandID = p.pkBrand AND p.cgSlug = 'bathroom-fixtures' 
INNER JOIN ModelPrice AS mp ON (p.id = mp.product_id) 
INNER JOIN Brand_Data AS bd ON bd.pkID = p.pkBrand 
INNER JOIN tbl_filters AS f 
    ON (
     p.pkID = f.pkID and 
     p.pkCategory = f.Category 

    ) 
WHERE mp.Available = 1 
GROUP BY f.SortField 
ORDER BY f.ValueDisplayOrder 
ASC