我想知道在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向导。
答案 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_id
和price_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倍)因此它表示存在问题(非常大的表没有使用密钥)或磁盘问题(可能)。