我正在研究计算机视觉数据管道,但不确定如何构建我的数据库以优化写入。
我有大量的图像数据正在持续收集。图像帧用于构建 1-3 秒的视频剪辑,这些剪辑将由远程工作人员进行标记。工作人员使用各种属性(剪辑是否包含对象 x?)标记每个剪辑(使用我构建的 Web 应用程序)。
我当前的管道生成视频剪辑并将它们发送到 S3。Amazon Aurora(兼容 MySQL)数据库用于跟踪每个图像帧、剪辑和相关标签。
“帧”表包含每个图像帧的条目,以及相关的元数据。
“剪辑”表包含每个剪辑的条目,具有字段“start_frame_id”,它是定义给定剪辑中“帧”表中的第一帧的外键。远程工作人员从 S3 访问关联的剪辑,使用剪辑的 sha256 哈希作为键。
'labels' 表包含一个工作人员创建的每个标签的条目,并且与 'clips' 表相关。
“剪辑”和“帧”表都包含原始文件的 sha256 哈希。
该数据库需要针对写入进行大量优化,因为帧和剪辑的数量将非常庞大(每天将添加大约 500K 帧,剪辑为 20fps)。所有到 S3 的上传和对数据库的写入都是从本地机器完成的。
我构建的原型使用自动递增整数作为主键。但是,这需要客户端以小块执行数据库写入。由于每个剪辑都需要引用其起始帧,因此在提交剪辑之前,我必须提交给定剪辑的所有帧以获得第一帧的主键。此解决方案还使得以后添加仅插入写入副本变得棘手/不可能。出于这个原因,我正在讨论使用 UUID 而不是整数,但我知道这会导致连接的性能问题。
我应该使用 UUID 还是整数?
UUIDs
当您有客户端独立生成唯一标识符时很有用。id INT UNSIGNED AUTO_INCREMENT
更小,更快,“有序”等。仅当您没有可行的替代方案时才使用 UUID。更多讨论:http: //mysql.rjweb.org/doc.php/uuid
在我看来,sha256 对于“摘要”来说太过分了。
INSERTed
每天50 万行?那是6/秒?不是问题。当你达到 100/秒时,我们应该进一步讨论。