我被要求开发一个网络软件,可以存储一些从热计量设备中读取的数据,并将热量费用分摊给所有的业主。我选择使用MySQL engine MyISAM在php中工作。
我不习惯于处理大数据,所以我只创建了一个逻辑数据库:
还有一个单独的表格,与大楼相连,存放着开始日期和费用分摊的结束日期。
当需要从建筑物中获取所有数据时,我使用的方法是使用单个查询从DB获取原始数据,在php中详细说明,而不是进行下一个查询。
下面是我使用的操作序列:
SELECT * FROM flats where building_id=my_building_idSELECT * FROM heaters where flat_id=my_flat_idSELECT * FROM reading_values where heater_id=my_heater_id AND data<my_data现在的问题是,我有严重的性能问题。
在有人指出之前,我不能只看到上面列出的所有前6步的数值,因为我需要打印账单,在每一张账单上我必须写出所有的平面信息和所有加热器的信息,所以我必须得到所有的单位和加热器的数据。
因此,我想就如何提高脚本性能提出一些建议:
我没有插入特定的代码,因为我认为这会使问题太重,但如果被问到,我可以插入一些。
发布于 2015-10-21 15:56:26
有些:
希望能帮上忙!
问候
编辑:只是为了举例说明另一个查询,不确定这是否适合您的特定需求,也不需要测试它(这可能意味着我忘了一些东西):
SELECT
a.field1,
b.field2,
c.field3,
d.field4
FROM heaters a
JOIN reading_values b ON (b.heater_id = a.heater_id)
JOIN flats c ON (c.flat_id = a.flat_id)
JOIN buildings d ON (d.building_id = c.building_id)
WHERE
a.heater_id = my_heater_id
AND b.date < my_date
GROUP BY a.heater_id编辑2
在您的评论之后,我修改了这个查询,以便它可以检索您想要的信息:给定一个建筑id,它将根据给定的日期列出所有加热器及其最新的读取值:
SELECT
a.name,
b.name,
c.name,
d.reading_value,
d.created
FROM buildings a
JOIN flats b ON (b.building_id = a.building_id)
JOIN heaters c ON (c.flat_id = b.flat_id)
JOIN reading_values d ON (d.reading_value_id = (SELECT reading_value_id FROM reading_values WHERE created <= my_date AND heater_id = c.heater_id ORDER BY created DESC LIMIT 1))
WHERE
a.building_id = my_building_id
GROUP BY c.heater_id了解它在您的环境中的表现应该是很有趣的。
问候
https://stackoverflow.com/questions/33263583
复制相似问题