0

我想知道在 mySQL 表中布置数据的最佳格式,以便可以以最快的方式查询它以收集一组每日值以供 php 进一步使用。

到目前为止,我已经这样布置了表格:

item_id    price_date     price_amount
      1    2000-03-01             22.4
      2    2000-03-01            19.23
      3    2000-03-01             13.4
      4    2000-03-01            14.95
      1    2000-03-02             22.5
      2    2000-03-02            19.42
      3    2000-03-02             13.4
      4    2000-03-02            13.95

将 item_id 定义为索引。

另外,我正在使用:

"SELECT DISTINCT price_date FROM table_name" 

获取包含唯一日期列表的数组。

此外,循环内的代码部分(以及我的优化问题的重点)当前编写为:

"SELECT price_amount FROM table_name WHERE item_id = 1 ORDER BY price_date"

这第二个“SELECT”语句实际上是在一个循环中,我在其中选择/存储数组中请求的每个 item_id 的每日价格。

所有当前都在正常运行并从 mySQL 中正确提取数据,但是,上面列出的“SELECT”语句每次运行大约需要 4-5 秒才能完成,并且在循环 100 多个产品以创建摘要时,加起来一个非常低效/缓慢的信息系统。

有没有更有效的方法可以构建 mySQL 表和/或 SELECT 语句以更快地检索结果?也许在不同的列上定义不同的索引?我已使用 EXPLAIN 命令返回每个查询的信息,但不确定如何使用 EXPLAIN 信息来提高查询效率。

提前感谢任何可以提供帮助的 mySQL 向导。

4

2 回答 2

1

单列索引

我在用:

  "SELECT DISTINCT price_date FROM table_name" 

获取包含唯一日期列表的数组。

如果为price_date列创建索引,则可以更有效地执行此查询:

ALTER TABLE table_name ADD INDEX price_idx (price_date);

多列索引

此外,循环内的代码部分(以及我的优化问题的重点)当前编写为:

  "SELECT price_amount FROM table_name WHERE item_id = 1 ORDER BY price_date"

对于第二个查询,您应该创建一个涵盖 theitem_idprice_date列的索引:

 ALTER TABLE table_name ADD INDEX item_price_idx (item_id, price_date);
于 2013-03-01T12:07:36.953 回答
0

我知道这有点晚了,但我偶然发现了这一点,并认为我会把我的想法融入其中。

使用得当的索引对于加速查询非常有帮助(解释显示了一些非常棒的结果,围绕哪些索引被选择 - 如果有的话 - 用于特定查询)。然而,高效的 PHP 将提供更多帮助。

在您的情况下,您没有显示 PHP,但看起来您提供了日期列表,然后循环查找该日期中的所有项目以获取价格。执行以下操作会更有效:

选择 item_id, price_amount from table_name where price_date= order by item_id, price_amount

在 price_date、item_id、price_amount 上有一个索引(最好是唯一索引)

然后,您将通过生成的 SQL 进行单个循环,而不是具有多个 SQL 连接的循环(如果您的 SQL 服务器与 PHP 框分开,则尤其如此,因为外部网络连接可能会产生开销)。

单个查询需要 4-5 秒,但速度非常慢(至少是 100 倍),因此它表明存在问题(非常大的表,没有可使用的键)或磁盘问题(可能)。

于 2014-06-12T09:49:55.080 回答