【问题标题】:Why is my SQL statement taking so long为什么我的 SQL 语句需要这么长时间
【发布时间】:2013-10-24 12:16:31
【问题描述】:

我目前正在尝试使用 php 脚本从我的 (mysql) 数据库中导出一些数据,尽管我也直接在 phpmyadmin 的 sql 部分中尝试了 sql 语句,结果相同。

我要做的是从我的数据库中导出每个独特的产品,以及最便宜的总价,那里有库存且价格(成本)大于 0,即数量 > 0 且价格 > 0

所以,我想我已经在一些帮助下弄清楚了,它似乎适用于一个小数据集,但我目前在这个表中有大约 500,000 行,并且它会增长。

所以我的陈述是:

SELECT 
products.name,
products.price,
products.quantity,
products.totalprice
FROM
products INNER JOIN
  (SELECT name, MIN(totalprice) min_price
   FROM products
   WHERE quantity>0 AND price>0
   GROUP BY name) m
  ON products.name=m.name AND products.totalprice=min_price

在 phpmyadmin 中,它只是出现了“正在加载”状态,正如您所期望的那样,但实际上从来没有给我任何值。然后我必须“停止”mysql和apache(我使用xampp)然后重新启动它们,否则我无法在数据库中做任何事情。

如果有人能看出这句话有什么问题,很高兴听到任何建议。

编辑

我已经尝试过简单的 sql 语句,但它们似乎没有给我正确的答案。例如我已经尝试过:

SELECT name, MIN(totalprice) min_price, quantity
   FROM products
     WHERE quantity>0 AND totalprice>0
   GROUP BY name

但正如你从我的 sql fiddle 中看到的那样 http://sqlfiddle.com/#!2/dd9f4/7/0

这给了我不正确的值,也就是说,它给了我数量超过 0 的最便宜的价格,但是数量的回报,列表中数量超过 0 的第一个值,因此为什么我必须将产品与产品结合起来 谢谢

【问题讨论】:

  • 您是否运行EXPLAIN 命令查看使用了哪些索引?
  • @AgRizzo 没有索引
  • 添加一些索引。我会在“名称”上尝试一个索引,看看会发生什么
  • 另外,回到您的评估“我确实需要查看所有数据”:虽然是的,但您的查询包含一个 JOIN,即 MySQL 需要“对齐或分组您的数据”。根据经验,在组成 JOIN(通常是外键)的字段上放置一个索引。让我们知道它是否加快了速度。索引有一个目的:使 READ 更快(以 WRITE 为代价——但这是一个更长的对话)
  • 没错,在导入之前删除索引,然后为导出重新创建它们。您被困在优化读取性能或写入性能方面。你不能两者兼得,否则 MySQL 团队会为我们实现它:)

标签: mysql phpmyadmin


【解决方案1】:

我认为这个查询返回你想要的(使用子查询而不是连接)。它在小提琴中非常快。这会在您的数据库中足够快地执行吗?如果它很大,您可能仍然需要索引。

select name, totalprice, quantity
from products P
where totalprice > 0
and totalprice = 
(select min(totalprice) 
                     from products where name = P.name 
                     and quantity > 0)

【讨论】:

  • 这里只是一个注释...如果您有两个名称相同且总价格相同的记录,则只会返回其中一个。如果您想在这种情况下求和数量,您可以这样做,但请注意此示例的限制。
  • 如果这样做,请确保在(name, quantity) 或至少在name 上添加索引。您真的不希望子查询必须为表中的每条记录扫描整个表一次,如果有 where 子句但没有相关索引,它会这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-11
  • 2012-05-11
相关资源
最近更新 更多