2017-02-26 159 views
-2

我有一个只有30 000行的MySql数据表。这不是一个大数据表,但加载时间显着更长(超过60秒)。我有3个表,分类,产品和公司。我需要根据所选类别加载产品和公司数据。这是我的代码。它的工作原理,但加载非常缓慢..PHP MySql - 数据加载速度很慢

" 
SELECT p1.CompanyID 
    , p1.NameE as ProductName 
    , p1.CategoryID 
    , c1.CompanyID as CompanyID 
    , c1.NameE as CompanyName 
    FROM Products as p1 
    JOIN Companies as c1 
    ON p1.CategoryID = ".$row['CategoryID']." 
    AND p1.CompanyID = c1.CompanyID 
GROUP 
    BY ProductName 
ORDER 
    BY CompanyName ASC LIMIT 0, 15; 
"; 
+1

请提供查询的执行计划 – GurV

+2

为什么您使用group by by aggregation function? ..(这可能会返回意外的结果列不在组中,并导致一个错误开始到MySQL 5.7) – scaisEdge

+0

移动p1.CategoryID =“。$ rpw ['CategoryID']”。从连接的ON子句到WHERE子句。它不是连接关系的一部分,并限制主表中的记录数。 –

回答

-1

请确保您在连接的ON子句中使用的列的索引。然后尝试更改您的查询,如下所示:

$queryList = $db->query(
    "SELECT p1.CompanyID, p1.NameE as ProductName, p1.CategoryID, c1.CompanyID as CompanyID, c1.NameE as CompanyName 
    FROM Products as p1 
    INNER JOIN Companies as c1 
    ON p1.CompanyID=c1.CompanyID 
    WHERE p1.CategoryID=".$row['CategoryID']." 
    GROUP BY ProductName 
    ORDER BY CompanyName ASC 
    LIMIT 0, 15"); 
+0

谢谢斯隆的建议,它提高了性能。但是加载数据仍需要30秒以上(从60秒降低)。我在列上有索引。 – Arun

+0

你在服务器上使用什么硬件/操作系统?我做了一个包含30k虚拟记录和三个表格的测试,就像您在共享托管服务器上描述的一样。运行查询花费的时间少于0.23秒。除了硬件和相关问题(碎片整理等),我能想到的唯一事情就是如何定义表格。你在使用大型字段吗?检查索引以确保它们已被定义。检查执行计划以查看它们是否正在使用。你的ID字段是无符号整数吗?发布你的表格定义,也许有人可以发现可能有用的东西。 –