最佳的mySQL表索引结构,可以更快地对大量日常数据进行SELECT

时间:2013-03-01 11:52:38

标签: php mysql optimization select

我想知道在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向导。

2 个答案:

答案 0 :(得分: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"

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

 ALTER TABLE table_name ADD INDEX item_price_idx (item_id, price_date);

答案 1 :(得分:0)

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

使用的索引在加速查询方面非常有用(解释显示了一些非常好的结果,围绕选择哪些索引 - 如果有的话 - 用于特定查询)。然而,有效的PHP将有助于实现更多目标。

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

从table_name中选择item_id,price_amount,其中price_date =按item_id排序,price_amount

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

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

单个查询的4-5秒虽然非常慢但至少为100倍)因此它表示存在问题(非常大的表没有使用密钥)或磁盘问题(可能)。