如何在MySQL中没有主键的情况下有效地更新值?

时间:2017-12-17 15:51:15

标签: mysql sql database

我目前面临设计数据库表和更新/插入值的问题 该表用于收集和汇总由以下标识的统计信息:

  • 来源
  • 用户
  • 统计数据
  • 可选材料(例如项目类型)
  • 可选实体(例如动物)

我的主要问题是,我提议的主键太大,因为EventDateTime用于识别统计信息。

我当前的表格是这样创建的:

DATE_FORMAT(EventDateTime, '%Y-%m-%d')

特别是,DATE(EventDateTime)是可配置的,VARCHAR是UUID,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和{{1}同样地。然后使用player_id汇总statistic以计算整体统计信息。

到目前为止,它有效,但每当我想更新一个值时,我必须使用material AND entity语句,因为我没有主键,我无法弄清楚如何创建这样的MySQL中约束的主键。

我的主要问题是:如何有效地更新此表中的值并在它们当前不存在时插入它们而不必删除所有行并插入新行?

主要问题似乎是MySQL对主键的限制。我不认为添加value列可以解决这个问题。

3 个答案:

答案 0 :(得分:0)

只需添加自动增加的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)`

根据您的代码的样子,您可能需要索引中的其他键或不同键,或者多个索引。

答案 1 :(得分:0)

按照以下希望它将解决您的问题: - - 首先使用变量让我们假设"详细"和你的桌子一样钱。 - 在你的项目中使用insert语句然后在使用语句之前获取详细的最大值(SELECT MAX(详细)+1作为maxid FROM TABLE_NAME(并使用它作为使用数字,它将帮助你FETCH,删除记录。 - 您也可以使用此更新但在更新期间不需要MAXIMUM详细信息。

希望您理解这一点,它会对您有所帮助。

答案 2 :(得分:0)

我通过互联网挖了更多,并对我的代码进行了大量优化。

我问这个问题是因为表现不好,我认为这是因为DELETEINSERT语句相互跟随。

我想我可以尝试通过INSERT IGNORE语句后跟UPDATE语句或INSERT .. ON DUPLICATE KEY UPDATE语句来减轻负担。但是由于MySQL的限制,它们需要密钥才能使用,而我无法访问它。

我已修复了性能问题:

通过减少异步生成的语句数量(我知道JDBC阻塞但它有效,它只是阻塞了数千个线程)和禁用自动提交,我能够通过<强> 600 次(从60秒降至0.1秒)。

接下来的步骤是改善连接字符串并获得更高的性能。