我很想听听大家对这个问题的看法。我目前在 RDS 中使用 Innodb mysql v8。我们的数据库中等,有大约 130 个表,大多数都很小,最大的表在 6 年内有大约 3000 万行。目前,我们已经将 RDS 即时垂直扩展得比我们的数据库需要的要大得多,但我们仍然受到 CPU 限制,并且无法使用副本,因为从属设备落后太多了。我确信这是因为我们将 UUID 版本 1 作为表的主键,并且必须为我们的应用程序进行大量字符串比较。
我想做的是通过创建使用自动递增 INT 作为主键和外键的表子集来证明这一点,但我正在努力了解这是如何工作的。如果我只是向当前表添加一个自动递增列,我们的 ORM 使用的查询将不会包含它,因此不会有太大的收益。我想知道如何使用转换表将值从 UUID 交换到 INT。例如,ORM 查询现在的内容如下:
select id_primary_key from table_old where id_foreign_key in (UUID1, UUID2, UUID3) ,输出为:1d3sed4a-5812-a35c-0204-515f6at42b46
如果我创建一个包含 auto_inc INT 和旧 UUID 的转换表,那么下一步是什么,以便当 ORM 运行该查询时,它针对 INT 而不是 UUID 进行查询?
select id_primary_key from table_new where id_foreign_key in (1, 2, 3) 输出:58743
有什么想法吗?
更新——看来我们将来会研究更多的全局模型,其中有多个数据库,因此将保留 UUID。我们将尝试走分片路线,并尝试将它们存储为 VARBINARY(16) 并使用 UUIDtoBIN() 并将交换标志设置为 true,因为我们使用的是 UUID v1。感谢大家的回答和时间!我从测试中学到了很多东西。