1

我的问题是我添加的行越多,检索 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 级别的数据结构问题(我没有主键,也没有唯一键,也没有索引设置,因为我不知道如何使用 then)。

让我给你一些关于我正在做什么以及我正在尝试做什么的背景信息。

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

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

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

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

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

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

排名

  • c_id int(11),不为空,AUTO_INCREMENT
  • ad_id varchar(20),不为空
  • rank int(3) 不为空
  • 卖家 int(20),不为空
  • 键 varchar(30),不为空
  • 日期时间戳,CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
  • uuid varchar(36)

用户

  • c_id int(11),不为空,AUTO_INCREMENT
  • 卖家 int(20),不为空
  • 别名 varchar(30),不为空
  • 日期时间戳,CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
  • uuid varchar(36)

项目

  • c_id int(11),不为空,AUTO_INCREMENT
  • ad_id varchar(20),不为空
  • 标题 varchar(30),不为空
  • 字幕 varchar(30), null
  • 访问 int(11),不为空
  • 日期时间戳,CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
  • uuid varchar(36)

这是我的查询

选择rankings.key、rankings.rank、items.visits、users.seller、users.alias、rankings.ad_id、items.title、rankings.date

FROM排名

LEFT JOIN 项目上的rankings.uuid = items.uuid

LEFT JOIN users ON rankings.seller = users.seller

WHERE 排名.key = '苹果'

GROUP BY 排名.日期,排名.排名

我做错了什么?请任何帮助/提示将不胜感激!并感谢您提前提供帮助!

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

第二次编辑Scorpi0 成功了!!!请参阅下面的他/她的答案。

4

2 回答 2

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。

于 2013-04-12T16:41:14.470 回答
0

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

于 2013-04-12T16:15:25.283 回答