插入/更新可伸缩性(搜索越来越长的更新匹配列表是站不住脚的)

Insert/ Update Scalability (searching increasingly longer list for update match untenable)

在这里没有找到明确的答案。

我正在执行基本的 "Insert/ Update' -- funneling new data into a MySQL database of "门票。

例如:

ticket_id: 154
status: open
messages: 2

那将是数据库中的一张票。

传入记录将根据 ticket_id 插入/更新。也就是说,如果 ticket_id 是新的,它将被插入,如果它被查找并找到,它将被更新。为了可能进一步简化这一点,ticket_ids 以递增的顺序递增。 ticket_id 1 是第一张票,依此类推

这是我的问题。现在我在数据库中插入/更新 100,000 ticket_ids。每个 insert/update 写入(与纯插入不同)- 必须针对 100,000 个 ID 查找每个传入的 ID,以确定更新的潜在匹配。每个月这将增加另外 60,000 张票 ---- 直到最终在每次每日插入/更新期间有超过 1,000,000 ticket_ids "looked up"。这是不可扩展的。事实上,对于大型 MySQL 数据库中的任何常规插入/更新来说,这似乎是一个极其常见的问题。

以下是潜在的好东西:

  1. Ticket_IDs唯一且依次递增
  2. 票证变为状态:30 天不活动后关闭。这意味着它们将永远不会再次更新。这是这里的关键。我不确定如何在没有每天 "looking up" 的情况下在插入/更新期间从技术上 "ignore" 这些票证。一种方法是每天或每月将 "closed" 票转移到单独的数据库 table,并使用联合进行数据库查询。对此有何想法?我无论如何都不是数据库管理员。

这是答案吗? 2 tables,以及工单存档?

还有...索引 Ticket_ID 有什么好处吗?我听说这会增加写入时间,但会减少读取时间。

我认为我现在的问题是为插入/更新编写时间,而不是 SELECT 语句。但是有人告诉我,insert/update 本质上是 SELECT/ 查找。

您应该做的第一件事是查看您已有的索引

SHOW CREATE TABLE my_table_name\G

如果您的 UPSERT 越来越慢,向 ticket_id 添加索引绝对是一个不错的起点。我建议你做一个唯一索引。

CREATE UNIQUE INDEX my_index_name my_table_name (ticket_id);

添加索引确实会减慢 INSERT 速度,但对于每月有 60,000 条新记录且总共有 1,000,000 条记录的数据库,您可能不会注意到。