gpt4 book ai didi

mysql - 如何构建 mysql 表以尽可能减少对数据库的压力(使用 hibernate)

转载 作者:行者123 更新时间:2023-11-29 14:49:34 25 4
gpt4 key购买 nike

我在使用 hibernate 时有一个关于数据库结构的问题。

我必须在数据库中保存每天的信息(一个数字)。很多时候我需要选择一整月的信息。

当我得到一张包含(日期、信息)的表格时,我必须执行最多 31 次选择才能获取一个月的数据。由于我经常这样做,它会给数据库带来压力。

现在我想将整个信息(31个数字)写入月表,其中一列“月”和另一列“信息”,其中我放入所有数字,并用“;”分隔。那么我只需要做一项选择。但我必须拆分数据记录才能获取数字(按每个“;”拆分)。

也许,另一个解决方案是月表,有 32 列(月份和 1 到 31)。 1 到 31 列将是tinyints,我将在其中存储数字。我必须做出一个选择来获取每个月的数据,并且我不必拆分数据记录,但可以请求每列的数据(我使用 hibernate )

最后一个解决方案有什么我没有想到的缺点吗? :-) 您会推荐另一种解决方案吗?

[编辑]感谢您的帮助。这是之前的数据结构:

create table CLIENTS_DATA (
client_id int UNSIGNED NOT NULL,
datum date NOT NULL,
information tinyint UNSIGNED NOT NULL default 0,
** additional informations **
primary key(client_id, datum),
foreign key(client_id) references clients(id) ON DELETE CASCADE ON UPDATE CASCADE)
ENGINE=InnoDB;

我现在将整整一个月的信息存储在:

create table CLIENTS_MONTHLY_INFORMATIONS (
client_id int UNSIGNED NOT NULL,
datum date NOT NULL,
i1 tinyint NOT NULL default 0,
i2 tinyint NOT NULL default 0,
i3 tinyint NOT NULL default 0,
i4 tinyint NOT NULL default 0,
i5 tinyint NOT NULL default 0,
i6 tinyint NOT NULL default 0,
i7 tinyint NOT NULL default 0,
i8 tinyint NOT NULL default 0,
i9 tinyint NOT NULL default 0,
i10 tinyint NOT NULL default 0,
i11 tinyint NOT NULL default 0,
i12 tinyint NOT NULL default 0,
i13 tinyint NOT NULL default 0,
i14 tinyint NOT NULL default 0,
i15 tinyint NOT NULL default 0,
i16 tinyint NOT NULL default 0,
i17 tinyint NOT NULL default 0,
i18 tinyint NOT NULL default 0,
i19 tinyint NOT NULL default 0,
i20 tinyint NOT NULL default 0,
i21 tinyint NOT NULL default 0,
i22 tinyint NOT NULL default 0,
i23 tinyint NOT NULL default 0,
i24 tinyint NOT NULL default 0,
i25 tinyint NOT NULL default 0,
i26 tinyint NOT NULL default 0,
i27 tinyint NOT NULL default 0,
i28 tinyint NOT NULL default 0,
i29 tinyint NOT NULL default 0,
i30 tinyint NOT NULL default 0,
i31 tinyint NOT NULL default 0,
average float UNSIGNED,
primary key(client_id, datum),
foreign key(client_id) references clients(id) ON DELETE CASCADE ON UPDATE CASCADE)
ENGINE=InnoDB;

对第二个表的查询将是:

public ClientsMonthlyInformations getClientsMonthlyInformationsByIdAndDate(int uid, Date datum) {

ClientsMonthlyInformations cmi = (ClientsMonthlyInformations) this.sessionFactory.getCurrentSession().createQuery("from ClientsMonthlyInformations clientsmonthlyinformations where clientsmonthlyinformations.clients.id=:clientsid and clientsmonthlyinformations.datum=:date").setParameter("clientsid", uid).setParameter("date", datum).uniqueResult();

return cmi;
}

为了从第一个表中获取数据,我使用相同的条目,但当然是 ClientsData 而不是 ClientsMonthlyInformation。你是对的,我可以创建一个查询来获取 31 个数据记录,这意味着 31 个 Hibernate 对象。我不知道为什么我认为对 31 行进行一次选择来获取 31 个对象会很糟糕。

最佳答案

have to do up to 31 selects to get the data for one month. As I do this very often, it stresses the database

经常定义?您目前还有几天时间?除非每秒超过 20 次,否则不会对数据库产生任何可测量的影响。

Now I thought of writing the whole information (31 numbers) into a MONTH-table

这是一个非常愚蠢的想法,并且不能解决问题。

如果您必须发出 31 个选择才能获取一个月的数据,那么您确实需要了解有关查询数据库的更多信息。

如果不知道您的表结构是什么,也不知道您需要的输出格式是什么,就不可能提供具体的解决方案,但您可以考虑:

 SELECT DATE_FORMAT(a.date, '%Y-%m'), GROUP_CONCAT(metric)
FROM (
SELECT a.date, a.metric
FROM your_table a
WHERE a.date>20110101000000
ORDER BY a.date
)
GROUP BY DATE_FORMAT(a.date, '%Y-%m');

(假设您希望以非规范化结构输出 - 并且绝对确定没有丢失/重复的日期)

关于mysql - 如何构建 mysql 表以尽可能减少对数据库的压力(使用 hibernate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6073933/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com