在MySQL和PHP中,使用multitables和LEFT JOIN进行极慢的查询

时间:2013-04-12 16:11:10

标签: sql performance phpmyadmin localhost left-join

我的问题是我添加的行越多,检索SQL查询结果所需的越多。我不是在谈论大量的行(10,000到80,000之间)。一开始我需要几毫秒才能从查询中检索结果,昨天我需要花费3分钟才能显示50行,但是从今天开始它只能最大化:

致命错误:第247行的C:\ wamp \ apps \ phpmyadmin3.5.1 \ libraries \ dbi \ mysqli.dbi.lib.php超出了300秒的最长执行时间

找不到它的错误(我是一个SQL新手)。我已经苦苦挣扎了两个月了。我已经尝试了所有可能的解决方案,我可以在互联网上找到(包括这里),以加快事情,我甚至更改了主机,phpMyAdmin,MySQL,httpd.config,iPV6等配置文件等。但是,因为没有这工作我回滚了所有更改,创建了一个新的数据库,我在其中添加了一个唯一的uuid来加入数据库中的表

但是作为一只斑驳的树懒,它仍然很慢!

我不确定它是PHP,MySQL,apache本地服务器(WAMPP)的问题,还是SQL级别的数据结构问题(我没有主键,也不是唯一键,也不是索引集,因为我不知道如何使用)。

让我给你一些背景信息,说明我正在做什么,我正在尝试做什么。

我每天都会进行多次 API调用,以获取针对特定搜索引擎的产品和搜索的不同广告的排名位置。我使用Python来解析API对象,但也将数据注入MySQL数据库。

每个页面结果都列出了50个与搜索引擎相关的产品广告。这个排名位置每天都在变化根据搜索引擎中使用的关键字(“密钥”)生成每个排名位置列表。虽然每个产品每天都可以更改其属性,但它始终具有相同的唯一ID('ad_id')。例如,产品ad_id = a001今天可能会显示其访问次数比前一天多200次,或者其卖家可能更改了他/她的“别名”。

我在排名位置列表(排名数据库)中生成 uuid字符串,从那里我将该uuid附加到其他数据库。

所以这些我的表格(请参阅下面的链接)。为了清楚起见,我过于简单了。这些表只显示前3行,请注意RANKINGS,ITEMS和USERS的第三行显示不同的日期(这是因为我每天更新数据库)。

http://oi49.tinypic.com/11ceidz.jpg

这实际上是我的数据结构的样子(基于过于简化的示例):

排名

  • c_id int(11),not null,AUTO_INCREMENT
  • ad_id varchar(20),not null
  • rank int(3)not null
  • 卖家int(20),非null
  • key varchar(30),not null
  • 日期时间戳,CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
  • uuid varchar(36)

用户

  • c_id int(11),not null,AUTO_INCREMENT
  • 卖家int(20),非null
  • alias varchar(30),not null
  • 日期时间戳,CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
  • uuid varchar(36)

  • c_id int(11),not null,AUTO_INCREMENT
  • ad_id varchar(20),not null
  • title varchar(30),not null
  • subtitle varchar(30),null
  • 访问int(11),而不是null
  • 日期时间戳,CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
  • uuid varchar(36)

这是我的查询

SELECT rankings.key,rankings.rank,items.visits,users.seller,users.alias,rankings.ad_id,items.title,rankingings.date

FROM排名

在Rankings.uuid = items.uuid

上的LEFT JOIN项目

LEFT JOIN用户ON rankings.seller = users.seller

WHERE rankings.key ='apple'

GROUP BY rankings.date,rankings.rank

我做错了什么?请完全赞赏任何帮助/提示!谢谢你提前帮忙!

编辑:如果我删除 GROUP BY 行并添加 LIMIT 0,50 查询结果只需几毫秒...但是有大量的重复行!如果限制0,500 =仅4秒。

第二次编辑 Scorpi0 钉了它!!!请参阅下面的答案。

2 个答案:

答案 0 :(得分:5)

哇!

  

我没有主键,也没有唯一键,也没有索引集,因为我不知道如何使用

真的?然后学习!!
如果没有索引,查询将在O(n ^ 3)中运行3个表。使用索引,它将在O(log n)中运行。

跑步

CREATE INDEX idxrankginsuuid ON rankings(uuid);
CREATE INDEX idxrankingsseller ON rankings(seller);
CREATE INDEX idxrankingskey ON rankings(key);

CREATE INDEX idxitemsuuid ON items(uuid);

CREATE INDEX idxuserseller ON users(seller);

你会注意到性能的提高。

如果不了解主键和索引的工作原理,就无法执行SQL。

答案 1 :(得分:0)

服务器持续过多以处理查询,因为它不是一个简单的查询。您可以优化MySQL查询和数据库结构以尝试加速该过程,或者,如果不能,则通过添加set_time_limit(0);将最大执行时间更改为PHP脚本的无限制。脚本的开头。