我目前面临着设计数据库表和更新/插入值的问题。 该表用于收集和汇总由以下标识的统计信息:
我的主要问题是,我提议的主键太大,因为VARCHAR
s用于识别统计数据。
我当前的表是这样创建的:
CREATE TABLE `Statistics` (
`server_id` varchar(255) NOT NULL,
`player_id` binary(16) NOT NULL,
`statistic` varchar(255) NOT NULL,
`material` varchar(255) DEFAULT NULL,
`entity` varchar(255) DEFAULT NULL,
`value` bigint(20) NOT NULL)
特别是,server_id
是可配置的,player_id
是UUID,statistic
是可能改变的枚举的表示,material
和entity
同样。然后使用value
汇总SUM()
以计算总体统计量。
到目前为止它工作,但每当我想更新一个值时,我必须使用DELETE
和INSERT
语句,因为我没有主键,我无法弄清楚如何在MySQL的约束中创建这样的主键。
我的主要问题是:如何有效地更新此表中的值并在它们当前不存在时插入它们而不诉诸删除所有行并插入新行?
主要问题似乎是MySQL对主键的限制。我不认为添加id
列可以解决这个问题。
只需添加一个自动递增的ID:
CREATE TABLE `Statistics` (
statistis_id int auto_increment primary key,
`server_id` varchar(255) NOT NULL,
`player_id` binary(16) NOT NULL,
`statistic` varchar(255) NOT NULL,
`material` varchar(255) DEFAULT NULL,
`entity` varchar(255) DEFAULT NULL,
`value` bigint(20) NOT NULL
);
瞧!主键。但是你可能想要一个索引。想到的一个:
create index idx_statistics_server_player_statistic on statistics(server_id, player_id, statistic)`
根据代码的外观,您可能需要索引中的其他键或不同键,或多个索引。
按照下面的希望它将解决你的问题: - - 首先使用一个变量让我们假设“详细”作为你的表钱。 - 在你的项目中使用insert语句然后在使用语句之前获取详细的最大值(SELECT MAX(详细)+1作为maxid FROM TABLE_NAME(并使用它作为使用数字,它将帮助你FETCH,删除记录.-你在更新期间也可以用此更新但不需要详细的MAXIMUM。
希望你理解这一点,它会对你有所帮助。
我通过互联网挖了更多,并优化了我的代码。
我问这个问题是因为表现不好,我认为这是因为DELETE
和INSERT
声明相互跟随。
我想我可以尝试通过INSERT IGNORE
语句,然后是UPDATE
语句或INSERT .. ON DUPLICATE KEY UPDATE
语句来减少负载。但是由于MySQL中的限制,它们需要密钥才能使用我无法访问的密钥。
我已经解决了性能问题:
通过减少异步生成的语句数量(我知道JDBC阻塞但它有效,它只阻塞了数千个线程)并禁用了自动提交,我能够将性能提高600倍(从60秒降低到0.1秒) 。
接下来的步骤是改进连接字符串并获得更高的性能。